<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>10 上传用户头像 | AJ</title>
    <meta name="generator" content="VuePress 1.5.0">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <script>
            var _hmt = _hmt || [];
            (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?51b8c2e72d1adf96524638ce85bb7d72";
            var s = document.getElementsByTagName("script")[0]; 
            s.parentNode.insertBefore(hm, s);

            // 引入谷歌,不需要可删除这段
            var hm1 = document.createElement("script");
            hm1.src = "https://www.googletagmanager.com/gtag/js?id=G-B7351EYS04";
            var s1 = document.getElementsByTagName("script")[0]; 
            s1.parentNode.insertBefore(hm1, s1);
            })();

            // 谷歌加载,不需要可删除
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());

            gtag('config', 'G-B7351EYS04');
        </script>
    <meta name="description" content="阿俊博客|记录一个程序员的成长历程 阿俊博客(blog.zhequtao.com)记录一个后端程序员的成长历程,分享他的学习笔记和心得,还有些开发必备技巧哦! java golang web html dev开发">
    <link rel="preload" href="/assets/css/0.styles.a3df589e.css" as="style"><link rel="preload" href="/assets/js/app.cb35c8f6.js" as="script"><link rel="preload" href="/assets/js/2.063846a6.js" as="script"><link rel="preload" href="/assets/js/4.1ffb4609.js" as="script"><link rel="preload" href="/assets/js/95.be52d65a.js" as="script"><link rel="prefetch" href="/assets/js/10.5629fe4d.js"><link rel="prefetch" href="/assets/js/100.8417ccea.js"><link rel="prefetch" href="/assets/js/101.37fdb377.js"><link rel="prefetch" href="/assets/js/102.848b686d.js"><link rel="prefetch" href="/assets/js/103.6a2489a0.js"><link rel="prefetch" href="/assets/js/104.99e8899f.js"><link rel="prefetch" href="/assets/js/105.8b741763.js"><link rel="prefetch" href="/assets/js/106.08163715.js"><link rel="prefetch" href="/assets/js/107.21801349.js"><link rel="prefetch" href="/assets/js/108.e3a2892b.js"><link rel="prefetch" href="/assets/js/109.dab5618c.js"><link rel="prefetch" href="/assets/js/11.cddc1623.js"><link rel="prefetch" href="/assets/js/110.f5249b39.js"><link rel="prefetch" href="/assets/js/111.9abf8bce.js"><link rel="prefetch" href="/assets/js/112.8eb86924.js"><link rel="prefetch" href="/assets/js/113.c180ed46.js"><link rel="prefetch" href="/assets/js/114.2370f5b5.js"><link rel="prefetch" href="/assets/js/115.88dc3fd8.js"><link rel="prefetch" href="/assets/js/116.63403600.js"><link rel="prefetch" href="/assets/js/117.83674aa0.js"><link rel="prefetch" href="/assets/js/118.9c58c685.js"><link rel="prefetch" href="/assets/js/119.621f9a70.js"><link rel="prefetch" href="/assets/js/12.ff3d03f5.js"><link rel="prefetch" href="/assets/js/120.a6d2b7f7.js"><link rel="prefetch" href="/assets/js/121.ae0ce9d1.js"><link rel="prefetch" href="/assets/js/122.de240e6d.js"><link rel="prefetch" href="/assets/js/123.b043e3e4.js"><link rel="prefetch" href="/assets/js/124.550af937.js"><link rel="prefetch" href="/assets/js/125.6f06b34c.js"><link rel="prefetch" href="/assets/js/126.38d64604.js"><link rel="prefetch" href="/assets/js/127.a948db56.js"><link rel="prefetch" href="/assets/js/128.4ca789e0.js"><link rel="prefetch" href="/assets/js/129.59be4505.js"><link rel="prefetch" href="/assets/js/13.e9f75cc3.js"><link rel="prefetch" href="/assets/js/130.ddae76a9.js"><link rel="prefetch" href="/assets/js/131.d969c265.js"><link rel="prefetch" href="/assets/js/132.5f43ce5c.js"><link rel="prefetch" href="/assets/js/133.b651af22.js"><link rel="prefetch" href="/assets/js/134.2499236a.js"><link rel="prefetch" href="/assets/js/135.4180596c.js"><link rel="prefetch" href="/assets/js/136.2c309233.js"><link rel="prefetch" href="/assets/js/137.72ca42dd.js"><link rel="prefetch" href="/assets/js/138.3772cd38.js"><link rel="prefetch" href="/assets/js/139.1d0a53da.js"><link rel="prefetch" href="/assets/js/14.be4b89ed.js"><link rel="prefetch" href="/assets/js/140.22368353.js"><link rel="prefetch" href="/assets/js/141.a14aef3c.js"><link rel="prefetch" href="/assets/js/142.2041ce3a.js"><link rel="prefetch" href="/assets/js/143.377262ec.js"><link rel="prefetch" href="/assets/js/144.8fcbc368.js"><link rel="prefetch" href="/assets/js/145.46da36bf.js"><link rel="prefetch" href="/assets/js/146.eceae0d9.js"><link rel="prefetch" href="/assets/js/147.e1bd6531.js"><link rel="prefetch" href="/assets/js/148.76f193ce.js"><link rel="prefetch" href="/assets/js/149.587bd581.js"><link rel="prefetch" href="/assets/js/15.e3219ac0.js"><link rel="prefetch" href="/assets/js/150.169c71e0.js"><link rel="prefetch" href="/assets/js/151.384021ea.js"><link rel="prefetch" href="/assets/js/152.0f20cf03.js"><link rel="prefetch" href="/assets/js/153.fd94af1e.js"><link rel="prefetch" href="/assets/js/154.a550f5dc.js"><link rel="prefetch" href="/assets/js/155.ba1ae86e.js"><link rel="prefetch" href="/assets/js/156.3b98ded0.js"><link rel="prefetch" href="/assets/js/157.cd378596.js"><link rel="prefetch" href="/assets/js/158.c138d0df.js"><link rel="prefetch" href="/assets/js/159.2635f7f4.js"><link rel="prefetch" href="/assets/js/16.c9c35d42.js"><link rel="prefetch" href="/assets/js/160.d51b4126.js"><link rel="prefetch" href="/assets/js/161.5dc29e7b.js"><link rel="prefetch" href="/assets/js/162.f257a92b.js"><link rel="prefetch" href="/assets/js/163.9eb75e40.js"><link rel="prefetch" href="/assets/js/164.8fb1e22b.js"><link rel="prefetch" href="/assets/js/165.49255503.js"><link rel="prefetch" href="/assets/js/166.e54539e6.js"><link rel="prefetch" href="/assets/js/167.a06acdb0.js"><link rel="prefetch" href="/assets/js/168.948ab620.js"><link rel="prefetch" href="/assets/js/169.7d756812.js"><link rel="prefetch" href="/assets/js/17.81067bc8.js"><link rel="prefetch" href="/assets/js/170.ffe63330.js"><link rel="prefetch" href="/assets/js/171.835398b9.js"><link rel="prefetch" href="/assets/js/172.3987be39.js"><link rel="prefetch" href="/assets/js/173.e3cedb8a.js"><link rel="prefetch" href="/assets/js/174.11a32588.js"><link rel="prefetch" href="/assets/js/175.da6f9782.js"><link rel="prefetch" href="/assets/js/176.50e55edc.js"><link rel="prefetch" href="/assets/js/177.a89a1d17.js"><link rel="prefetch" href="/assets/js/178.7ad3ce84.js"><link rel="prefetch" href="/assets/js/179.98a1343b.js"><link rel="prefetch" href="/assets/js/18.b67caf4c.js"><link rel="prefetch" href="/assets/js/180.4e98599b.js"><link rel="prefetch" href="/assets/js/181.dd885afd.js"><link rel="prefetch" href="/assets/js/182.789990c8.js"><link rel="prefetch" href="/assets/js/183.f11ca2fd.js"><link rel="prefetch" href="/assets/js/184.fcf128ec.js"><link rel="prefetch" href="/assets/js/185.54e1e9b6.js"><link rel="prefetch" href="/assets/js/186.db91021a.js"><link rel="prefetch" href="/assets/js/187.5309dd42.js"><link rel="prefetch" href="/assets/js/188.615821ea.js"><link rel="prefetch" href="/assets/js/189.f23f1d42.js"><link rel="prefetch" href="/assets/js/19.294a011c.js"><link rel="prefetch" href="/assets/js/190.efe894bc.js"><link rel="prefetch" href="/assets/js/191.0d14904a.js"><link rel="prefetch" href="/assets/js/192.efd25a9e.js"><link rel="prefetch" href="/assets/js/193.88151f34.js"><link rel="prefetch" href="/assets/js/194.efedce14.js"><link rel="prefetch" href="/assets/js/195.03ac15bb.js"><link rel="prefetch" href="/assets/js/196.fbc18389.js"><link rel="prefetch" href="/assets/js/197.0257ab5e.js"><link rel="prefetch" href="/assets/js/198.f1de2817.js"><link rel="prefetch" href="/assets/js/199.8f1c166b.js"><link rel="prefetch" href="/assets/js/20.1a41edb1.js"><link rel="prefetch" href="/assets/js/200.4af99727.js"><link rel="prefetch" href="/assets/js/201.9f8caef1.js"><link rel="prefetch" href="/assets/js/202.6f07d705.js"><link rel="prefetch" href="/assets/js/203.5012fe50.js"><link rel="prefetch" href="/assets/js/204.3a0dfd8e.js"><link rel="prefetch" href="/assets/js/205.0ba9b606.js"><link rel="prefetch" href="/assets/js/206.663a49ec.js"><link rel="prefetch" href="/assets/js/207.b2406149.js"><link rel="prefetch" href="/assets/js/208.b0b2dfd8.js"><link rel="prefetch" href="/assets/js/209.41a0ec9f.js"><link rel="prefetch" href="/assets/js/21.b6ea6f9a.js"><link rel="prefetch" href="/assets/js/210.6f36beb8.js"><link rel="prefetch" href="/assets/js/211.90ef6e5c.js"><link rel="prefetch" href="/assets/js/212.42339063.js"><link rel="prefetch" href="/assets/js/213.a2bfeda9.js"><link rel="prefetch" href="/assets/js/214.5c7eb42a.js"><link rel="prefetch" href="/assets/js/215.18260ae5.js"><link rel="prefetch" href="/assets/js/216.7678fd29.js"><link rel="prefetch" href="/assets/js/217.9d936f88.js"><link rel="prefetch" href="/assets/js/218.bac403c4.js"><link rel="prefetch" href="/assets/js/219.9d8cb16b.js"><link rel="prefetch" href="/assets/js/22.367cc253.js"><link rel="prefetch" href="/assets/js/220.375b7707.js"><link rel="prefetch" href="/assets/js/221.3e400da4.js"><link rel="prefetch" href="/assets/js/222.8fbd2857.js"><link rel="prefetch" href="/assets/js/223.76a10075.js"><link rel="prefetch" href="/assets/js/224.ff94cc4e.js"><link rel="prefetch" href="/assets/js/225.d4688ca6.js"><link rel="prefetch" href="/assets/js/226.b13b18af.js"><link rel="prefetch" href="/assets/js/227.288d0f96.js"><link rel="prefetch" href="/assets/js/228.60430ac0.js"><link rel="prefetch" href="/assets/js/229.da728342.js"><link rel="prefetch" href="/assets/js/23.bc3de730.js"><link rel="prefetch" href="/assets/js/230.d8417d20.js"><link rel="prefetch" href="/assets/js/231.6a9ce0b4.js"><link rel="prefetch" href="/assets/js/232.7611b413.js"><link rel="prefetch" href="/assets/js/233.94712cf9.js"><link rel="prefetch" href="/assets/js/234.93888298.js"><link rel="prefetch" href="/assets/js/235.62506981.js"><link rel="prefetch" href="/assets/js/236.5a055c7c.js"><link rel="prefetch" href="/assets/js/237.0a6c4902.js"><link rel="prefetch" href="/assets/js/238.e5f37663.js"><link rel="prefetch" href="/assets/js/239.331bba86.js"><link rel="prefetch" href="/assets/js/24.82f0901c.js"><link rel="prefetch" href="/assets/js/240.59591cfc.js"><link rel="prefetch" href="/assets/js/241.ce671f47.js"><link rel="prefetch" href="/assets/js/242.fb2542fa.js"><link rel="prefetch" href="/assets/js/243.74abc73d.js"><link rel="prefetch" href="/assets/js/244.ecd707b2.js"><link rel="prefetch" href="/assets/js/245.d728367b.js"><link rel="prefetch" href="/assets/js/246.9270e7fe.js"><link rel="prefetch" href="/assets/js/247.a421ba15.js"><link rel="prefetch" href="/assets/js/248.e759132e.js"><link rel="prefetch" href="/assets/js/249.3077fb46.js"><link rel="prefetch" href="/assets/js/25.95c551dc.js"><link rel="prefetch" href="/assets/js/250.5fe4dd03.js"><link rel="prefetch" href="/assets/js/251.4b8fe76c.js"><link rel="prefetch" href="/assets/js/252.0d1cf7ea.js"><link rel="prefetch" href="/assets/js/253.89d16ba0.js"><link rel="prefetch" href="/assets/js/254.8d1afc68.js"><link rel="prefetch" href="/assets/js/255.64e680cb.js"><link rel="prefetch" href="/assets/js/256.9defbd0e.js"><link rel="prefetch" href="/assets/js/257.1fef24fd.js"><link rel="prefetch" href="/assets/js/258.4e205286.js"><link rel="prefetch" href="/assets/js/259.f3d56efc.js"><link rel="prefetch" href="/assets/js/26.7fe56bac.js"><link rel="prefetch" href="/assets/js/260.378299e6.js"><link rel="prefetch" href="/assets/js/261.8e4fb397.js"><link rel="prefetch" href="/assets/js/262.54595d98.js"><link rel="prefetch" href="/assets/js/263.fb333dc1.js"><link rel="prefetch" href="/assets/js/264.13d13301.js"><link rel="prefetch" href="/assets/js/265.c85104bc.js"><link rel="prefetch" href="/assets/js/266.9f3d1f1c.js"><link rel="prefetch" href="/assets/js/267.fb392815.js"><link rel="prefetch" href="/assets/js/268.add7eacb.js"><link rel="prefetch" href="/assets/js/269.7e49fcc7.js"><link rel="prefetch" href="/assets/js/27.5547e5f0.js"><link rel="prefetch" href="/assets/js/270.22342070.js"><link rel="prefetch" href="/assets/js/271.59917b1a.js"><link rel="prefetch" href="/assets/js/272.4a4751d5.js"><link rel="prefetch" href="/assets/js/273.f4c2fa5c.js"><link rel="prefetch" href="/assets/js/274.1208bc94.js"><link rel="prefetch" href="/assets/js/275.f6528753.js"><link rel="prefetch" href="/assets/js/276.a68772cd.js"><link rel="prefetch" href="/assets/js/277.f154ab32.js"><link rel="prefetch" href="/assets/js/278.bb616a63.js"><link rel="prefetch" href="/assets/js/279.6a356cff.js"><link rel="prefetch" href="/assets/js/28.b08b2847.js"><link rel="prefetch" href="/assets/js/280.5afc20fc.js"><link rel="prefetch" href="/assets/js/281.3cd86225.js"><link rel="prefetch" href="/assets/js/282.3ecb92aa.js"><link rel="prefetch" href="/assets/js/283.85159ea7.js"><link rel="prefetch" href="/assets/js/284.b6545c68.js"><link rel="prefetch" href="/assets/js/285.5e83ee29.js"><link rel="prefetch" href="/assets/js/286.2aad298d.js"><link rel="prefetch" href="/assets/js/287.3ca76244.js"><link rel="prefetch" href="/assets/js/288.5b17963d.js"><link rel="prefetch" href="/assets/js/289.f47a759b.js"><link rel="prefetch" href="/assets/js/29.562dbf7d.js"><link rel="prefetch" href="/assets/js/290.36b603c7.js"><link rel="prefetch" href="/assets/js/291.a9bd8951.js"><link rel="prefetch" href="/assets/js/292.dfc54f28.js"><link rel="prefetch" href="/assets/js/293.2d061212.js"><link rel="prefetch" href="/assets/js/294.6d564a9e.js"><link rel="prefetch" href="/assets/js/295.a31dd593.js"><link rel="prefetch" href="/assets/js/296.3101e5e8.js"><link rel="prefetch" href="/assets/js/297.7efde936.js"><link rel="prefetch" href="/assets/js/298.8bb3aa68.js"><link rel="prefetch" href="/assets/js/299.8b51e6bd.js"><link rel="prefetch" href="/assets/js/3.76257eb7.js"><link rel="prefetch" href="/assets/js/30.221adea2.js"><link rel="prefetch" href="/assets/js/300.62effe45.js"><link rel="prefetch" href="/assets/js/301.98c863c5.js"><link rel="prefetch" href="/assets/js/302.e3493ab2.js"><link rel="prefetch" href="/assets/js/303.800c8028.js"><link rel="prefetch" href="/assets/js/304.b6f08986.js"><link rel="prefetch" href="/assets/js/305.09af356b.js"><link rel="prefetch" href="/assets/js/306.d0d3589d.js"><link rel="prefetch" href="/assets/js/307.ee2fd249.js"><link rel="prefetch" href="/assets/js/308.f3f76368.js"><link rel="prefetch" href="/assets/js/309.d2b5ce40.js"><link rel="prefetch" href="/assets/js/31.334fc8bb.js"><link rel="prefetch" href="/assets/js/310.b4fa2feb.js"><link rel="prefetch" href="/assets/js/311.7d747ef3.js"><link rel="prefetch" href="/assets/js/312.89bdff40.js"><link rel="prefetch" href="/assets/js/313.875b82fe.js"><link rel="prefetch" href="/assets/js/314.0bbe51c4.js"><link rel="prefetch" href="/assets/js/315.cc07dbcf.js"><link rel="prefetch" href="/assets/js/316.bc72b152.js"><link rel="prefetch" href="/assets/js/317.55462812.js"><link rel="prefetch" href="/assets/js/318.a158fda0.js"><link rel="prefetch" href="/assets/js/319.b03a5bd2.js"><link rel="prefetch" href="/assets/js/32.d6826b16.js"><link rel="prefetch" href="/assets/js/320.a5bd19b0.js"><link rel="prefetch" href="/assets/js/321.4f9faaa7.js"><link rel="prefetch" href="/assets/js/322.dbd3b4fa.js"><link rel="prefetch" href="/assets/js/323.a04e2062.js"><link rel="prefetch" href="/assets/js/324.c45b46cf.js"><link rel="prefetch" href="/assets/js/325.cd1460c4.js"><link rel="prefetch" href="/assets/js/326.bd90ef85.js"><link rel="prefetch" href="/assets/js/327.8bf38ef7.js"><link rel="prefetch" href="/assets/js/328.99e9aed3.js"><link rel="prefetch" href="/assets/js/329.de0012cb.js"><link rel="prefetch" href="/assets/js/33.b1059062.js"><link rel="prefetch" href="/assets/js/330.59f11391.js"><link rel="prefetch" href="/assets/js/331.6d16a13c.js"><link rel="prefetch" href="/assets/js/332.922ca235.js"><link rel="prefetch" href="/assets/js/333.c94c3602.js"><link rel="prefetch" href="/assets/js/334.77e02010.js"><link rel="prefetch" href="/assets/js/335.1e0c4f7b.js"><link rel="prefetch" href="/assets/js/336.5675dc4f.js"><link rel="prefetch" href="/assets/js/337.bb6e11dc.js"><link rel="prefetch" href="/assets/js/338.294981e9.js"><link rel="prefetch" href="/assets/js/339.d0376372.js"><link rel="prefetch" href="/assets/js/34.0c7d5782.js"><link rel="prefetch" href="/assets/js/340.64596428.js"><link rel="prefetch" href="/assets/js/341.ec0f9409.js"><link rel="prefetch" href="/assets/js/342.7abc47c4.js"><link rel="prefetch" href="/assets/js/343.4262d486.js"><link rel="prefetch" href="/assets/js/344.8729ad8c.js"><link rel="prefetch" href="/assets/js/345.c210d888.js"><link rel="prefetch" href="/assets/js/346.6f42f7cb.js"><link rel="prefetch" href="/assets/js/347.81b41ae5.js"><link rel="prefetch" href="/assets/js/348.07eca37c.js"><link rel="prefetch" href="/assets/js/349.8019d6f3.js"><link rel="prefetch" href="/assets/js/35.ae14e37f.js"><link rel="prefetch" href="/assets/js/350.57da2e7b.js"><link rel="prefetch" href="/assets/js/351.2e99afdf.js"><link rel="prefetch" href="/assets/js/352.67dd88b7.js"><link rel="prefetch" href="/assets/js/353.15b9f624.js"><link rel="prefetch" href="/assets/js/354.a63e8432.js"><link rel="prefetch" href="/assets/js/355.bbc16ee9.js"><link rel="prefetch" href="/assets/js/356.ff63d3bb.js"><link rel="prefetch" href="/assets/js/357.4fb2d941.js"><link rel="prefetch" href="/assets/js/358.55182977.js"><link rel="prefetch" href="/assets/js/359.265c3d26.js"><link rel="prefetch" href="/assets/js/36.b9ed4cf1.js"><link rel="prefetch" href="/assets/js/360.ced80eb3.js"><link rel="prefetch" href="/assets/js/361.afe6ba84.js"><link rel="prefetch" href="/assets/js/362.c2b62518.js"><link rel="prefetch" href="/assets/js/363.0c4a4800.js"><link rel="prefetch" href="/assets/js/364.ce60291b.js"><link rel="prefetch" href="/assets/js/365.0e3a61f9.js"><link rel="prefetch" href="/assets/js/366.d53ccb03.js"><link rel="prefetch" href="/assets/js/367.689e464d.js"><link rel="prefetch" href="/assets/js/368.418c571f.js"><link rel="prefetch" href="/assets/js/369.c2fff3c8.js"><link rel="prefetch" href="/assets/js/37.a021ac57.js"><link rel="prefetch" href="/assets/js/370.a932b958.js"><link rel="prefetch" href="/assets/js/371.7d153241.js"><link rel="prefetch" href="/assets/js/372.fb9878fa.js"><link rel="prefetch" href="/assets/js/373.85772e03.js"><link rel="prefetch" href="/assets/js/374.b4a8b1b6.js"><link rel="prefetch" href="/assets/js/375.32f70596.js"><link rel="prefetch" href="/assets/js/376.a16d79a8.js"><link rel="prefetch" href="/assets/js/377.c996b7e1.js"><link rel="prefetch" href="/assets/js/378.d37d15c7.js"><link rel="prefetch" href="/assets/js/379.b81ba7dd.js"><link rel="prefetch" href="/assets/js/38.89138658.js"><link rel="prefetch" href="/assets/js/380.524c9b31.js"><link rel="prefetch" href="/assets/js/381.7ebfd6db.js"><link rel="prefetch" href="/assets/js/382.29edda0f.js"><link rel="prefetch" href="/assets/js/383.9642a212.js"><link rel="prefetch" href="/assets/js/384.086e3b42.js"><link rel="prefetch" href="/assets/js/385.a9bb46a8.js"><link rel="prefetch" href="/assets/js/386.f2561a39.js"><link rel="prefetch" href="/assets/js/387.ba9b6aaa.js"><link rel="prefetch" href="/assets/js/388.e0ace495.js"><link rel="prefetch" href="/assets/js/389.ba8c09dd.js"><link rel="prefetch" href="/assets/js/39.04f331e3.js"><link rel="prefetch" href="/assets/js/390.de1bb48b.js"><link rel="prefetch" href="/assets/js/391.7cc6edeb.js"><link rel="prefetch" href="/assets/js/392.0493a6f7.js"><link rel="prefetch" href="/assets/js/393.ba2d3e62.js"><link rel="prefetch" href="/assets/js/394.b3aa9224.js"><link rel="prefetch" href="/assets/js/395.f4df3a60.js"><link rel="prefetch" href="/assets/js/396.09644790.js"><link rel="prefetch" href="/assets/js/397.76163964.js"><link rel="prefetch" href="/assets/js/398.377fd8fc.js"><link rel="prefetch" href="/assets/js/399.39059be5.js"><link rel="prefetch" href="/assets/js/40.a21abf05.js"><link rel="prefetch" href="/assets/js/400.559a547f.js"><link rel="prefetch" href="/assets/js/401.bc6d738c.js"><link rel="prefetch" href="/assets/js/402.c504ed7b.js"><link rel="prefetch" href="/assets/js/403.77a0af9c.js"><link rel="prefetch" href="/assets/js/404.0f408cc6.js"><link rel="prefetch" href="/assets/js/405.90b0bab6.js"><link rel="prefetch" href="/assets/js/406.01b11432.js"><link rel="prefetch" href="/assets/js/407.58991ce5.js"><link rel="prefetch" href="/assets/js/408.9806278e.js"><link rel="prefetch" href="/assets/js/409.8d9b4bb3.js"><link rel="prefetch" href="/assets/js/41.6bcfc592.js"><link rel="prefetch" href="/assets/js/410.02dee620.js"><link rel="prefetch" href="/assets/js/411.3d12d3a6.js"><link rel="prefetch" href="/assets/js/412.37a62624.js"><link rel="prefetch" href="/assets/js/413.bda7ca34.js"><link rel="prefetch" href="/assets/js/414.2abb6547.js"><link rel="prefetch" href="/assets/js/415.1d271923.js"><link rel="prefetch" href="/assets/js/416.d1b11dfe.js"><link rel="prefetch" href="/assets/js/417.fcbf07ff.js"><link rel="prefetch" href="/assets/js/418.524d40ba.js"><link rel="prefetch" href="/assets/js/419.f264e463.js"><link rel="prefetch" href="/assets/js/42.ec85a270.js"><link rel="prefetch" href="/assets/js/420.8b99e60d.js"><link rel="prefetch" href="/assets/js/421.c697d876.js"><link rel="prefetch" href="/assets/js/422.4af54ae0.js"><link rel="prefetch" href="/assets/js/423.b75f24ff.js"><link rel="prefetch" href="/assets/js/424.ea80054f.js"><link rel="prefetch" href="/assets/js/425.804b48b0.js"><link rel="prefetch" href="/assets/js/426.ffed8383.js"><link rel="prefetch" href="/assets/js/427.2040bd22.js"><link rel="prefetch" href="/assets/js/428.b878fb56.js"><link rel="prefetch" href="/assets/js/429.f81fd922.js"><link rel="prefetch" href="/assets/js/43.c174449d.js"><link rel="prefetch" href="/assets/js/430.16f328ab.js"><link rel="prefetch" href="/assets/js/431.56f11924.js"><link rel="prefetch" href="/assets/js/432.e4c77710.js"><link rel="prefetch" href="/assets/js/433.29acf14b.js"><link rel="prefetch" href="/assets/js/434.33ee22fc.js"><link rel="prefetch" href="/assets/js/435.516f7600.js"><link rel="prefetch" href="/assets/js/436.28ae526a.js"><link rel="prefetch" href="/assets/js/437.b9bac473.js"><link rel="prefetch" href="/assets/js/438.711bd934.js"><link rel="prefetch" href="/assets/js/439.fe5f28bd.js"><link rel="prefetch" href="/assets/js/44.8704338b.js"><link rel="prefetch" href="/assets/js/440.b2f48747.js"><link rel="prefetch" href="/assets/js/441.4862a724.js"><link rel="prefetch" href="/assets/js/442.751f8ae7.js"><link rel="prefetch" href="/assets/js/443.9998dbe9.js"><link rel="prefetch" href="/assets/js/444.23d3f688.js"><link rel="prefetch" href="/assets/js/445.72419f35.js"><link rel="prefetch" href="/assets/js/446.21e02b7b.js"><link rel="prefetch" href="/assets/js/447.6bd039e5.js"><link rel="prefetch" href="/assets/js/448.af29ff31.js"><link rel="prefetch" href="/assets/js/449.bbdca196.js"><link rel="prefetch" href="/assets/js/45.f8a2a3b3.js"><link rel="prefetch" href="/assets/js/450.32e470b8.js"><link rel="prefetch" href="/assets/js/451.f4c8ff6a.js"><link rel="prefetch" href="/assets/js/452.c0ec8943.js"><link rel="prefetch" href="/assets/js/453.5af475c6.js"><link rel="prefetch" href="/assets/js/454.567aa6c1.js"><link rel="prefetch" href="/assets/js/455.326072d1.js"><link rel="prefetch" href="/assets/js/456.64b88847.js"><link rel="prefetch" href="/assets/js/457.61c91559.js"><link rel="prefetch" href="/assets/js/458.4f4d43d6.js"><link rel="prefetch" href="/assets/js/459.a88891cb.js"><link rel="prefetch" href="/assets/js/46.90855a0f.js"><link rel="prefetch" href="/assets/js/460.fb9e15f6.js"><link rel="prefetch" href="/assets/js/461.998a4991.js"><link rel="prefetch" href="/assets/js/462.56ecfb03.js"><link rel="prefetch" href="/assets/js/463.582cd053.js"><link rel="prefetch" href="/assets/js/464.f12a0050.js"><link rel="prefetch" href="/assets/js/465.cc3b08a8.js"><link rel="prefetch" href="/assets/js/466.ea7e4ce2.js"><link rel="prefetch" href="/assets/js/467.58700d93.js"><link rel="prefetch" href="/assets/js/468.bb9998cd.js"><link rel="prefetch" href="/assets/js/469.232d261d.js"><link rel="prefetch" href="/assets/js/47.02516d33.js"><link rel="prefetch" href="/assets/js/470.90ab2be8.js"><link rel="prefetch" href="/assets/js/471.3652fec6.js"><link rel="prefetch" href="/assets/js/472.bc7517c9.js"><link rel="prefetch" href="/assets/js/473.27b7892f.js"><link rel="prefetch" href="/assets/js/474.0d488768.js"><link rel="prefetch" href="/assets/js/475.bc33cf17.js"><link rel="prefetch" href="/assets/js/476.76ce67eb.js"><link rel="prefetch" href="/assets/js/477.a20657f6.js"><link rel="prefetch" href="/assets/js/478.8905ef26.js"><link rel="prefetch" href="/assets/js/479.23ec3dc9.js"><link rel="prefetch" href="/assets/js/48.8d38983c.js"><link rel="prefetch" href="/assets/js/480.105bf58e.js"><link rel="prefetch" href="/assets/js/481.d62a3699.js"><link rel="prefetch" href="/assets/js/482.6cb10cdb.js"><link rel="prefetch" href="/assets/js/483.15b9ef53.js"><link rel="prefetch" href="/assets/js/484.794aff9c.js"><link rel="prefetch" href="/assets/js/485.3e6ef3cb.js"><link rel="prefetch" href="/assets/js/486.fc20eb22.js"><link rel="prefetch" href="/assets/js/487.2a4f7d47.js"><link rel="prefetch" href="/assets/js/488.24ba9af5.js"><link rel="prefetch" href="/assets/js/489.d451928e.js"><link rel="prefetch" href="/assets/js/49.bd70c59c.js"><link rel="prefetch" href="/assets/js/490.d83e4fc7.js"><link rel="prefetch" href="/assets/js/491.0210a738.js"><link rel="prefetch" href="/assets/js/492.3a69cd85.js"><link rel="prefetch" href="/assets/js/493.89d2920f.js"><link rel="prefetch" href="/assets/js/494.b7d1c15e.js"><link rel="prefetch" href="/assets/js/495.7ccfe17f.js"><link rel="prefetch" href="/assets/js/496.0d6c912a.js"><link rel="prefetch" href="/assets/js/497.087ca2c6.js"><link rel="prefetch" href="/assets/js/498.f2b3c894.js"><link rel="prefetch" href="/assets/js/499.e741f312.js"><link rel="prefetch" href="/assets/js/5.405f2620.js"><link rel="prefetch" href="/assets/js/50.9df07553.js"><link rel="prefetch" href="/assets/js/500.cb9babb9.js"><link rel="prefetch" href="/assets/js/501.63a859b6.js"><link rel="prefetch" href="/assets/js/502.f346b273.js"><link rel="prefetch" href="/assets/js/503.cdcd3de3.js"><link rel="prefetch" href="/assets/js/504.e83ec450.js"><link rel="prefetch" href="/assets/js/505.95f18293.js"><link rel="prefetch" href="/assets/js/506.02060a3c.js"><link rel="prefetch" href="/assets/js/507.859d6ae4.js"><link rel="prefetch" href="/assets/js/508.9724d886.js"><link rel="prefetch" href="/assets/js/509.e17dd53e.js"><link rel="prefetch" href="/assets/js/51.3dfc6350.js"><link rel="prefetch" href="/assets/js/510.ea0c942f.js"><link rel="prefetch" href="/assets/js/511.64a7f9a8.js"><link rel="prefetch" href="/assets/js/512.6cce418a.js"><link rel="prefetch" href="/assets/js/513.ea813fe8.js"><link rel="prefetch" href="/assets/js/514.10242470.js"><link rel="prefetch" href="/assets/js/515.5308bdf6.js"><link rel="prefetch" href="/assets/js/516.dfb113bc.js"><link rel="prefetch" href="/assets/js/517.96c71069.js"><link rel="prefetch" href="/assets/js/518.5594480e.js"><link rel="prefetch" href="/assets/js/519.91e848ae.js"><link rel="prefetch" href="/assets/js/52.dd230cd7.js"><link rel="prefetch" href="/assets/js/520.ebe69ce9.js"><link rel="prefetch" href="/assets/js/521.92b80342.js"><link rel="prefetch" href="/assets/js/522.6ce581ea.js"><link rel="prefetch" href="/assets/js/523.40b7f2f9.js"><link rel="prefetch" href="/assets/js/524.4ef256d3.js"><link rel="prefetch" href="/assets/js/525.19741e4a.js"><link rel="prefetch" href="/assets/js/526.e5de1675.js"><link rel="prefetch" href="/assets/js/527.9a79cd42.js"><link rel="prefetch" href="/assets/js/528.72732eb8.js"><link rel="prefetch" href="/assets/js/529.2ea03e45.js"><link rel="prefetch" href="/assets/js/53.a349c565.js"><link rel="prefetch" href="/assets/js/530.5d1103e7.js"><link rel="prefetch" href="/assets/js/531.82b032d6.js"><link rel="prefetch" href="/assets/js/532.12ee4beb.js"><link rel="prefetch" href="/assets/js/533.db9a90f7.js"><link rel="prefetch" href="/assets/js/534.fe139db4.js"><link rel="prefetch" href="/assets/js/535.056a6fbb.js"><link rel="prefetch" href="/assets/js/536.6bf85c15.js"><link rel="prefetch" href="/assets/js/537.6e2e1ccf.js"><link rel="prefetch" href="/assets/js/538.54eddb3b.js"><link rel="prefetch" href="/assets/js/539.6f00a207.js"><link rel="prefetch" href="/assets/js/54.e292b52f.js"><link rel="prefetch" href="/assets/js/540.9c956205.js"><link rel="prefetch" href="/assets/js/541.50f41228.js"><link rel="prefetch" href="/assets/js/542.a2b1879e.js"><link rel="prefetch" href="/assets/js/543.4e5e17c9.js"><link rel="prefetch" href="/assets/js/544.63d85227.js"><link rel="prefetch" href="/assets/js/545.c3923644.js"><link rel="prefetch" href="/assets/js/546.e64ad073.js"><link rel="prefetch" href="/assets/js/547.35a8752d.js"><link rel="prefetch" href="/assets/js/548.b62a1348.js"><link rel="prefetch" href="/assets/js/549.369e2ea0.js"><link rel="prefetch" href="/assets/js/55.21bb2983.js"><link rel="prefetch" href="/assets/js/550.b4632248.js"><link rel="prefetch" href="/assets/js/551.18f1879c.js"><link rel="prefetch" href="/assets/js/552.162e63cd.js"><link rel="prefetch" href="/assets/js/553.6998130e.js"><link rel="prefetch" href="/assets/js/554.89126c3d.js"><link rel="prefetch" href="/assets/js/555.a5f63b8a.js"><link rel="prefetch" href="/assets/js/556.35381cef.js"><link rel="prefetch" href="/assets/js/557.ceeecf52.js"><link rel="prefetch" href="/assets/js/558.253e6e4f.js"><link rel="prefetch" href="/assets/js/559.5cfbb773.js"><link rel="prefetch" href="/assets/js/56.5382d6b4.js"><link rel="prefetch" href="/assets/js/560.cca52f22.js"><link rel="prefetch" href="/assets/js/561.ea8d1141.js"><link rel="prefetch" href="/assets/js/562.c32e7b96.js"><link rel="prefetch" href="/assets/js/563.9bdd42e7.js"><link rel="prefetch" href="/assets/js/564.b3b87ec0.js"><link rel="prefetch" href="/assets/js/565.4be0d0f7.js"><link rel="prefetch" href="/assets/js/566.9f379d12.js"><link rel="prefetch" href="/assets/js/567.261e3181.js"><link rel="prefetch" href="/assets/js/568.4229e365.js"><link rel="prefetch" href="/assets/js/569.e662c167.js"><link rel="prefetch" href="/assets/js/57.8129f7e0.js"><link rel="prefetch" href="/assets/js/570.97ff6423.js"><link rel="prefetch" href="/assets/js/571.de1377cd.js"><link rel="prefetch" href="/assets/js/572.48b8400b.js"><link rel="prefetch" href="/assets/js/573.8251ebaf.js"><link rel="prefetch" href="/assets/js/574.ec3d6c1e.js"><link rel="prefetch" href="/assets/js/575.b0d429a1.js"><link rel="prefetch" href="/assets/js/576.98ce9170.js"><link rel="prefetch" href="/assets/js/577.85fc2017.js"><link rel="prefetch" href="/assets/js/578.1393ac7f.js"><link rel="prefetch" href="/assets/js/579.1340e178.js"><link rel="prefetch" href="/assets/js/58.85ac2740.js"><link rel="prefetch" href="/assets/js/580.a5979445.js"><link rel="prefetch" href="/assets/js/581.effdc269.js"><link rel="prefetch" href="/assets/js/582.13276063.js"><link rel="prefetch" href="/assets/js/583.357a2443.js"><link rel="prefetch" href="/assets/js/584.338ef731.js"><link rel="prefetch" href="/assets/js/585.87932741.js"><link rel="prefetch" href="/assets/js/586.b1d6e000.js"><link rel="prefetch" href="/assets/js/587.ed5b8377.js"><link rel="prefetch" href="/assets/js/588.16d2c418.js"><link rel="prefetch" href="/assets/js/589.c96fd7fa.js"><link rel="prefetch" href="/assets/js/59.0b225757.js"><link rel="prefetch" href="/assets/js/590.1a06b2a0.js"><link rel="prefetch" href="/assets/js/591.0efd886c.js"><link rel="prefetch" href="/assets/js/592.b22d0ef5.js"><link rel="prefetch" href="/assets/js/593.84ed6ebe.js"><link rel="prefetch" href="/assets/js/594.cd721b88.js"><link rel="prefetch" href="/assets/js/595.2400817a.js"><link rel="prefetch" href="/assets/js/596.f2c512d1.js"><link rel="prefetch" href="/assets/js/597.df10ec57.js"><link rel="prefetch" href="/assets/js/598.61ef6a7d.js"><link rel="prefetch" href="/assets/js/599.0bebb562.js"><link rel="prefetch" href="/assets/js/6.29d112b1.js"><link rel="prefetch" href="/assets/js/60.3bbab51d.js"><link rel="prefetch" href="/assets/js/600.1ea7596f.js"><link rel="prefetch" href="/assets/js/601.f2642bb3.js"><link rel="prefetch" href="/assets/js/602.400cc987.js"><link rel="prefetch" href="/assets/js/603.db77d173.js"><link rel="prefetch" href="/assets/js/604.0ffa30ae.js"><link rel="prefetch" href="/assets/js/605.32ca9607.js"><link rel="prefetch" href="/assets/js/606.8c1e5683.js"><link rel="prefetch" href="/assets/js/607.9c9463ef.js"><link rel="prefetch" href="/assets/js/608.d5efa77e.js"><link rel="prefetch" href="/assets/js/609.5bbffb7d.js"><link rel="prefetch" href="/assets/js/61.f7301486.js"><link rel="prefetch" href="/assets/js/610.5b0fc9da.js"><link rel="prefetch" href="/assets/js/611.bb8058c9.js"><link rel="prefetch" href="/assets/js/612.b0788f43.js"><link rel="prefetch" href="/assets/js/613.49511e65.js"><link rel="prefetch" href="/assets/js/614.fae3eacf.js"><link rel="prefetch" href="/assets/js/615.359e5899.js"><link rel="prefetch" href="/assets/js/616.905132f4.js"><link rel="prefetch" href="/assets/js/617.6c8c594e.js"><link rel="prefetch" href="/assets/js/618.6ac4f3ff.js"><link rel="prefetch" href="/assets/js/619.411a0c14.js"><link rel="prefetch" href="/assets/js/62.9aeede84.js"><link rel="prefetch" href="/assets/js/620.56155724.js"><link rel="prefetch" href="/assets/js/621.149d7933.js"><link rel="prefetch" href="/assets/js/622.f0c9bc08.js"><link rel="prefetch" href="/assets/js/623.e0989fbe.js"><link rel="prefetch" href="/assets/js/624.80b1f6a9.js"><link rel="prefetch" href="/assets/js/625.a0a392c4.js"><link rel="prefetch" href="/assets/js/626.56fd4e8a.js"><link rel="prefetch" href="/assets/js/627.264e7313.js"><link rel="prefetch" href="/assets/js/628.7a868b19.js"><link rel="prefetch" href="/assets/js/629.e7e15da1.js"><link rel="prefetch" href="/assets/js/63.4df55c8b.js"><link rel="prefetch" href="/assets/js/630.998c9b61.js"><link rel="prefetch" href="/assets/js/631.69aa049c.js"><link rel="prefetch" href="/assets/js/632.da3882c1.js"><link rel="prefetch" href="/assets/js/633.0d49adf0.js"><link rel="prefetch" href="/assets/js/634.f9984ede.js"><link rel="prefetch" href="/assets/js/635.f0439f65.js"><link rel="prefetch" href="/assets/js/636.54de4194.js"><link rel="prefetch" href="/assets/js/637.55d1c226.js"><link rel="prefetch" href="/assets/js/638.2a9a510f.js"><link rel="prefetch" href="/assets/js/639.8bec360e.js"><link rel="prefetch" href="/assets/js/64.7f3e5e81.js"><link rel="prefetch" href="/assets/js/640.30d7f96e.js"><link rel="prefetch" href="/assets/js/641.68100098.js"><link rel="prefetch" href="/assets/js/642.4b793817.js"><link rel="prefetch" href="/assets/js/643.d86a81ea.js"><link rel="prefetch" href="/assets/js/644.76327ea2.js"><link rel="prefetch" href="/assets/js/645.0ac6a923.js"><link rel="prefetch" href="/assets/js/646.cd92f728.js"><link rel="prefetch" href="/assets/js/647.f2c624e1.js"><link rel="prefetch" href="/assets/js/648.c8f3b955.js"><link rel="prefetch" href="/assets/js/649.6370753b.js"><link rel="prefetch" href="/assets/js/65.2beeae9b.js"><link rel="prefetch" href="/assets/js/650.afe31909.js"><link rel="prefetch" href="/assets/js/651.87971ec0.js"><link rel="prefetch" href="/assets/js/652.0adf10a6.js"><link rel="prefetch" href="/assets/js/653.1f655726.js"><link rel="prefetch" href="/assets/js/654.53e24c7c.js"><link rel="prefetch" href="/assets/js/655.c95a66ea.js"><link rel="prefetch" href="/assets/js/656.38b5a5ea.js"><link rel="prefetch" href="/assets/js/657.3167aa94.js"><link rel="prefetch" href="/assets/js/658.7c40ff62.js"><link rel="prefetch" href="/assets/js/659.5d2b9b54.js"><link rel="prefetch" href="/assets/js/66.44b214db.js"><link rel="prefetch" href="/assets/js/660.96a8da9e.js"><link rel="prefetch" href="/assets/js/661.4de3b6c1.js"><link rel="prefetch" href="/assets/js/662.7d9bf181.js"><link rel="prefetch" href="/assets/js/663.4ccaf40a.js"><link rel="prefetch" href="/assets/js/664.7ab4fa53.js"><link rel="prefetch" href="/assets/js/665.32245d26.js"><link rel="prefetch" href="/assets/js/666.e6617151.js"><link rel="prefetch" href="/assets/js/667.fb3b0547.js"><link rel="prefetch" href="/assets/js/668.3d1b2e36.js"><link rel="prefetch" href="/assets/js/669.b769905f.js"><link rel="prefetch" href="/assets/js/67.c31aaacf.js"><link rel="prefetch" href="/assets/js/670.88ed3af3.js"><link rel="prefetch" href="/assets/js/671.1aff6bfe.js"><link rel="prefetch" href="/assets/js/672.c90888f7.js"><link rel="prefetch" href="/assets/js/673.81241fdc.js"><link rel="prefetch" href="/assets/js/674.838a424d.js"><link rel="prefetch" href="/assets/js/675.603ac896.js"><link rel="prefetch" href="/assets/js/676.ff44b5dc.js"><link rel="prefetch" href="/assets/js/677.41a8087a.js"><link rel="prefetch" href="/assets/js/678.f0eb8d04.js"><link rel="prefetch" href="/assets/js/679.db78199e.js"><link rel="prefetch" href="/assets/js/68.08607c89.js"><link rel="prefetch" href="/assets/js/680.8fded9d4.js"><link rel="prefetch" href="/assets/js/681.0b019dfd.js"><link rel="prefetch" href="/assets/js/682.746e9190.js"><link rel="prefetch" href="/assets/js/683.d5c00845.js"><link rel="prefetch" href="/assets/js/684.b3207cad.js"><link rel="prefetch" href="/assets/js/685.d78f18ba.js"><link rel="prefetch" href="/assets/js/686.5aaecd19.js"><link rel="prefetch" href="/assets/js/687.821a06f4.js"><link rel="prefetch" href="/assets/js/688.8bbc1890.js"><link rel="prefetch" href="/assets/js/689.79b49e8c.js"><link rel="prefetch" href="/assets/js/69.509245d6.js"><link rel="prefetch" href="/assets/js/690.fa62f9dd.js"><link rel="prefetch" href="/assets/js/691.d3eb1a60.js"><link rel="prefetch" href="/assets/js/692.738f14bb.js"><link rel="prefetch" href="/assets/js/693.e6a497a2.js"><link rel="prefetch" href="/assets/js/694.6eea1c54.js"><link rel="prefetch" href="/assets/js/695.88e6acee.js"><link rel="prefetch" href="/assets/js/696.de10297f.js"><link rel="prefetch" href="/assets/js/697.96d04062.js"><link rel="prefetch" href="/assets/js/698.200cc84f.js"><link rel="prefetch" href="/assets/js/699.f11fc627.js"><link rel="prefetch" href="/assets/js/7.c16198b8.js"><link rel="prefetch" href="/assets/js/70.5f6285b1.js"><link rel="prefetch" href="/assets/js/700.93d48f59.js"><link rel="prefetch" href="/assets/js/701.b861f29a.js"><link rel="prefetch" href="/assets/js/702.dc82e05c.js"><link rel="prefetch" href="/assets/js/703.625ce87c.js"><link rel="prefetch" href="/assets/js/704.005a0a7c.js"><link rel="prefetch" href="/assets/js/705.16ad9230.js"><link rel="prefetch" href="/assets/js/706.4eead30a.js"><link rel="prefetch" href="/assets/js/707.730306ce.js"><link rel="prefetch" href="/assets/js/708.e37e743a.js"><link rel="prefetch" href="/assets/js/709.f2144f52.js"><link rel="prefetch" href="/assets/js/71.d5d0dae5.js"><link rel="prefetch" href="/assets/js/710.ee9d9b17.js"><link rel="prefetch" href="/assets/js/711.2813c338.js"><link rel="prefetch" href="/assets/js/712.e801bce4.js"><link rel="prefetch" href="/assets/js/713.21fc267c.js"><link rel="prefetch" href="/assets/js/714.4ec35525.js"><link rel="prefetch" href="/assets/js/715.fdc3cc84.js"><link rel="prefetch" href="/assets/js/716.324932ad.js"><link rel="prefetch" href="/assets/js/717.a072a66f.js"><link rel="prefetch" href="/assets/js/718.575e0305.js"><link rel="prefetch" href="/assets/js/719.5fdd55de.js"><link rel="prefetch" href="/assets/js/72.25648231.js"><link rel="prefetch" href="/assets/js/720.61477f23.js"><link rel="prefetch" href="/assets/js/721.c8bdab00.js"><link rel="prefetch" href="/assets/js/722.9255f385.js"><link rel="prefetch" href="/assets/js/723.f27792a4.js"><link rel="prefetch" href="/assets/js/724.cd504f88.js"><link rel="prefetch" href="/assets/js/725.55c845fa.js"><link rel="prefetch" href="/assets/js/726.bb49a9db.js"><link rel="prefetch" href="/assets/js/727.53d587fe.js"><link rel="prefetch" href="/assets/js/728.86972387.js"><link rel="prefetch" href="/assets/js/729.02fa0263.js"><link rel="prefetch" href="/assets/js/73.29902c1f.js"><link rel="prefetch" href="/assets/js/730.817156d1.js"><link rel="prefetch" href="/assets/js/731.6f5d6735.js"><link rel="prefetch" href="/assets/js/732.9a5ff781.js"><link rel="prefetch" href="/assets/js/733.bcb13916.js"><link rel="prefetch" href="/assets/js/734.11482b19.js"><link rel="prefetch" href="/assets/js/735.8c0d62f3.js"><link rel="prefetch" href="/assets/js/736.06465705.js"><link rel="prefetch" href="/assets/js/737.79741d87.js"><link rel="prefetch" href="/assets/js/738.cad12ff9.js"><link rel="prefetch" href="/assets/js/739.cb09e552.js"><link rel="prefetch" href="/assets/js/74.bcf666a0.js"><link rel="prefetch" href="/assets/js/740.029b1950.js"><link rel="prefetch" href="/assets/js/741.b937216a.js"><link rel="prefetch" href="/assets/js/742.ec02c706.js"><link rel="prefetch" href="/assets/js/743.70a96283.js"><link rel="prefetch" href="/assets/js/744.909b870c.js"><link rel="prefetch" href="/assets/js/745.80defb2d.js"><link rel="prefetch" href="/assets/js/746.fb972248.js"><link rel="prefetch" href="/assets/js/747.1a7b52fd.js"><link rel="prefetch" href="/assets/js/748.036f5d16.js"><link rel="prefetch" href="/assets/js/749.bd9a413d.js"><link rel="prefetch" href="/assets/js/75.23c5a54d.js"><link rel="prefetch" href="/assets/js/750.3f1ae8f5.js"><link rel="prefetch" href="/assets/js/751.8897bc9f.js"><link rel="prefetch" href="/assets/js/752.9b387659.js"><link rel="prefetch" href="/assets/js/753.f411ce21.js"><link rel="prefetch" href="/assets/js/754.26def684.js"><link rel="prefetch" href="/assets/js/755.923aff62.js"><link rel="prefetch" href="/assets/js/756.9965743a.js"><link rel="prefetch" href="/assets/js/757.0c6bbbfd.js"><link rel="prefetch" href="/assets/js/758.a830f8b1.js"><link rel="prefetch" href="/assets/js/759.987cad77.js"><link rel="prefetch" href="/assets/js/76.f54f3d4f.js"><link rel="prefetch" href="/assets/js/760.9f2652a0.js"><link rel="prefetch" href="/assets/js/761.df01a0ee.js"><link rel="prefetch" href="/assets/js/762.e0c05a1a.js"><link rel="prefetch" href="/assets/js/763.da8a60bd.js"><link rel="prefetch" href="/assets/js/764.9f2a2830.js"><link rel="prefetch" href="/assets/js/765.44e61161.js"><link rel="prefetch" href="/assets/js/766.cd7da8c1.js"><link rel="prefetch" href="/assets/js/767.6ea1fea2.js"><link rel="prefetch" href="/assets/js/768.91529b8f.js"><link rel="prefetch" href="/assets/js/769.194d7a3e.js"><link rel="prefetch" href="/assets/js/77.3d43a163.js"><link rel="prefetch" href="/assets/js/770.227fd5b9.js"><link rel="prefetch" href="/assets/js/771.44d5e37e.js"><link rel="prefetch" href="/assets/js/772.234d9bf6.js"><link rel="prefetch" href="/assets/js/773.ff1dfb6a.js"><link rel="prefetch" href="/assets/js/774.d401364f.js"><link rel="prefetch" href="/assets/js/775.37a7cf41.js"><link rel="prefetch" href="/assets/js/776.0cd10853.js"><link rel="prefetch" href="/assets/js/777.599a3a48.js"><link rel="prefetch" href="/assets/js/778.eef27a95.js"><link rel="prefetch" href="/assets/js/779.29351199.js"><link rel="prefetch" href="/assets/js/78.fd0780ac.js"><link rel="prefetch" href="/assets/js/780.74caed94.js"><link rel="prefetch" href="/assets/js/781.ee0fa9b5.js"><link rel="prefetch" href="/assets/js/782.7cffed09.js"><link rel="prefetch" href="/assets/js/783.7f01f518.js"><link rel="prefetch" href="/assets/js/784.5f65e3d7.js"><link rel="prefetch" href="/assets/js/785.d7e13880.js"><link rel="prefetch" href="/assets/js/786.6110d12f.js"><link rel="prefetch" href="/assets/js/787.334a5cdd.js"><link rel="prefetch" href="/assets/js/788.f261bc71.js"><link rel="prefetch" href="/assets/js/789.b6d74f7d.js"><link rel="prefetch" href="/assets/js/79.7b5d6224.js"><link rel="prefetch" href="/assets/js/790.fa948ec4.js"><link rel="prefetch" href="/assets/js/791.22080013.js"><link rel="prefetch" href="/assets/js/792.31ce806c.js"><link rel="prefetch" href="/assets/js/793.9fd0c56f.js"><link rel="prefetch" href="/assets/js/794.44a8cd9c.js"><link rel="prefetch" href="/assets/js/795.9f8346e5.js"><link rel="prefetch" href="/assets/js/796.0de9c7a1.js"><link rel="prefetch" href="/assets/js/797.83ac32a6.js"><link rel="prefetch" href="/assets/js/798.393fc81d.js"><link rel="prefetch" href="/assets/js/799.c1fb3981.js"><link rel="prefetch" href="/assets/js/8.3275ed06.js"><link rel="prefetch" href="/assets/js/80.df3f0a1f.js"><link rel="prefetch" href="/assets/js/800.2832adeb.js"><link rel="prefetch" href="/assets/js/801.04c58fc4.js"><link rel="prefetch" href="/assets/js/81.3d90ef6b.js"><link rel="prefetch" href="/assets/js/82.2d42448d.js"><link rel="prefetch" href="/assets/js/83.900b4de2.js"><link rel="prefetch" href="/assets/js/84.ff570f67.js"><link rel="prefetch" href="/assets/js/85.e3b3af39.js"><link rel="prefetch" href="/assets/js/86.17b5aedc.js"><link rel="prefetch" href="/assets/js/87.f931d1d6.js"><link rel="prefetch" href="/assets/js/88.d55863cd.js"><link rel="prefetch" href="/assets/js/89.15a9a6d7.js"><link rel="prefetch" href="/assets/js/9.04948a9d.js"><link rel="prefetch" href="/assets/js/90.22696aa9.js"><link rel="prefetch" href="/assets/js/91.f1bd8a2e.js"><link rel="prefetch" href="/assets/js/92.85733094.js"><link rel="prefetch" href="/assets/js/93.59bacfd7.js"><link rel="prefetch" href="/assets/js/94.a5f9b7a0.js"><link rel="prefetch" href="/assets/js/96.0b76ba8e.js"><link rel="prefetch" href="/assets/js/97.28183cd4.js"><link rel="prefetch" href="/assets/js/98.2d22829c.js"><link rel="prefetch" href="/assets/js/99.ed602a20.js">
    <link rel="stylesheet" href="/assets/css/0.styles.a3df589e.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">AJ</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <div></div> <div style="padding-left:1.5rem;"><div></div></div> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>区块链基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/blockchain/encryption-expand.html" class="sidebar-link">常见的密码技术</a></li><li><a href="/go-block/blockchain/encryption.html" class="sidebar-link">密码学安全</a></li><li><a href="/go-block/blockchain/ethereum.html" class="sidebar-link">以太坊智能合约</a></li><li><a href="/go-block/blockchain/hyperledgerfabric.html" class="sidebar-link">hyperledger fabric</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 1.2</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric/1搭建网络-纯手动.html" class="sidebar-link">1搭建网络-纯手动</a></li><li><a href="/go-block/fabric/1环境搭建.html" class="sidebar-link">1环境搭建</a></li><li><a href="/go-block/fabric/2Fabric介绍.html" class="sidebar-link">2Fabric介绍</a></li><li><a href="/go-block/fabric/3Fabric核心模块.html" class="sidebar-link">3Fabric核心模块</a></li><li><a href="/go-block/fabric/4网络搭建-脚本.html" class="sidebar-link">4网络搭建-脚本</a></li><li><a href="/go-block/fabric/5智能合约.html" class="sidebar-link">5智能合约</a></li><li><a href="/go-block/fabric/6Fabric账号.html" class="sidebar-link">6Fabric账号</a></li><li><a href="/go-block/fabric/7Solo多机多节点部署.html" class="sidebar-link">7Solo多机多节点部署</a></li><li><a href="/go-block/fabric/8Kafka多机多节点部署.html" class="sidebar-link">8Kafka多机多节点部署</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 2.X</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric2.x/" class="sidebar-link">2.X目录</a></li></ul></section></li></ul> </aside> <!----> <!----> <main class="page"><div class="theme-default-content" style="margin-bottom:-5rem;"><div class="bar"><div class="bar-intro"><div class="text">
      流逝的是岁月，不变的是情怀.
        </div> <div class="text">
      坚持学习，是为了成就更好的自己. <br></div> <div>公众号[中关村程序员]</div></div></div> <!----></div> <div class="theme-default-content content__default"><h1 id="_10-上传用户头像"><a href="#_10-上传用户头像" class="header-anchor">#</a> 10 上传用户头像</h1> <p>发送（上传）用户头像服务（用户相关）</p> <h2 id="流程与接口"><a href="#流程与接口" class="header-anchor">#</a> 流程与接口</h2> <p><img src="assets/clip_image002-1543152066379.jpg" alt="img"></p> <div class="language-json extra-class"><pre class="language-json"><code>#Request<span class="token operator">:</span>
method<span class="token operator">:</span> POST
url<span class="token operator">:</span>api/v<span class="token number">1.0</span>/user/avatar
#data<span class="token operator">:</span>
图片的二进制数据
#Response
#返回成功：
<span class="token punctuation">{</span>
  <span class="token property">&quot;errno&quot;</span><span class="token operator">:</span> <span class="token string">&quot;0&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;errmsg&quot;</span><span class="token operator">:</span> <span class="token string">&quot;成功&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;data&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">&quot;avatar_url&quot;</span><span class="token operator">:</span> <span class="token string">&quot;http://101.200.170.171:9998/group1/M00/00/00/Zciqq1n6_L-AOB04AADexS5wJKs662.png&quot;</span> <span class="token comment">//图片地址需要进行拼接</span>
  <span class="token punctuation">}</span> 

<span class="token punctuation">}</span>
#返回失败：
<span class="token punctuation">{</span>
    <span class="token property">&quot;errno&quot;</span><span class="token operator">:</span> <span class="token string">&quot;400x&quot;</span><span class="token punctuation">,</span>   <span class="token comment">//状态码</span>
    <span class="token property">&quot;errmsg&quot;</span><span class="token operator">:</span><span class="token string">&quot;状态错误信息&quot;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>fastdfs操纵函数</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">package</span> models

<span class="token keyword">import</span> <span class="token punctuation">(</span>
	<span class="token string">&quot;github.com/weilaihui/fdfs_client&quot;</span>
	<span class="token string">&quot;github.com/astaxie/beego&quot;</span>
<span class="token punctuation">)</span>

<span class="token comment">//通过文件名的方式进行上传</span>
<span class="token keyword">func</span> <span class="token function">UploadByFilename</span><span class="token punctuation">(</span> filename <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token punctuation">(</span>GroupName<span class="token punctuation">,</span>RemoteFileId <span class="token builtin">string</span> <span class="token punctuation">,</span>err <span class="token builtin">error</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token comment">//通过配置文件创建fdfs操作句柄</span>
	fdfsClient<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfs_client<span class="token punctuation">.</span><span class="token function">NewFdfsClient</span><span class="token punctuation">(</span><span class="token string">&quot;/home/itcast/go/src/go-1/homeweb/conf/client.conf&quot;</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		<span class="token comment">//说一下那里出问题了</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByFilename( ) fdfs_client.NewFdfsClient  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//unc (this *FdfsClient) UploadByFilename(filename string) (*UploadFileResponse, error)</span>
	<span class="token comment">//通过句柄上传文件（被上传的文件）</span>

	uploadResponse<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span> fdfsClient<span class="token punctuation">.</span><span class="token function">UploadByFilename</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByFilename( ) fdfsClient.UploadByFilename(filename)  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">)</span>
	<span class="token comment">//回传</span>
	<span class="token keyword">return</span>  uploadResponse<span class="token punctuation">.</span>GroupName <span class="token punctuation">,</span> uploadResponse<span class="token punctuation">.</span>RemoteFileId <span class="token punctuation">,</span><span class="token boolean">nil</span>

<span class="token punctuation">}</span>




<span class="token comment">//功能函数 操作fdfs上传二进制文件</span>
<span class="token keyword">func</span> <span class="token function">UploadByBuffer</span><span class="token punctuation">(</span>filebuffer <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span><span class="token punctuation">,</span> fileExtName <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token punctuation">(</span>GroupName<span class="token punctuation">,</span>RemoteFileId <span class="token builtin">string</span> <span class="token punctuation">,</span>err <span class="token builtin">error</span> <span class="token punctuation">)</span><span class="token punctuation">{</span>

	<span class="token comment">//通过配置文件创建fdfs操作句柄</span>
	fdfsClient<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfs_client<span class="token punctuation">.</span><span class="token function">NewFdfsClient</span><span class="token punctuation">(</span><span class="token string">&quot;/home/itcast/go/src/go-1/homeweb/conf/client.conf&quot;</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByBuffer( ) fdfs_client.NewFdfsClient  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//通过句柄上传二进制的文件</span>
	uploadResponse<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfsClient<span class="token punctuation">.</span><span class="token function">UploadByBuffer</span><span class="token punctuation">(</span>filebuffer<span class="token punctuation">,</span>fileExtName<span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByBuffer( ) fdfs_client.UploadByBuffer  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">)</span>
	<span class="token comment">//回传入</span>
	<span class="token keyword">return</span> uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">,</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">,</span><span class="token boolean">nil</span>

<span class="token punctuation">}</span>

</code></pre></div><h2 id="创建命令"><a href="#创建命令" class="header-anchor">#</a> 创建命令</h2> <div class="language-shell extra-class"><pre class="language-shell"><code>$ micro new  --type <span class="token string">&quot;srv&quot;</span> sss/PostAvatar
</code></pre></div><p>proto</p> <div class="language-protobuf extra-class"><pre class="language-protobuf"><code><span class="token keyword">service</span> <span class="token class-name">Example</span> <span class="token punctuation">{</span>
	rpc <span class="token function">PostAvatar</span><span class="token punctuation">(</span>Request<span class="token punctuation">)</span> returns <span class="token punctuation">(</span>Response<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">message</span> <span class="token class-name">Message</span> <span class="token punctuation">{</span>
	<span class="token builtin">string</span> say <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">message</span> <span class="token class-name">Request</span> <span class="token punctuation">{</span>
    <span class="token comment">//二进制图片</span>
	<span class="token builtin">bytes</span> Avatar <span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token comment">//sessionid</span>
    <span class="token builtin">string</span> Sessionid<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">;</span>
    <span class="token comment">//文件大小</span>
    <span class="token builtin">int64</span> filesize <span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">;</span>
    <span class="token comment">//文件名字</span>
    <span class="token builtin">string</span> filename <span class="token operator">=</span><span class="token number">4</span> <span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">message</span> <span class="token class-name">Response</span> <span class="token punctuation">{</span>
	<span class="token comment">//错误码</span>
	<span class="token builtin">string</span> Errno <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token comment">//错误信息</span>
    <span class="token builtin">string</span> Errmsg <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
    <span class="token comment">//回传的url</span>
    <span class="token builtin">string</span> Avatar_url <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>web中添加路由</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token comment">//上传头像 POST</span>
rou<span class="token punctuation">.</span><span class="token function">POST</span><span class="token punctuation">(</span><span class="token string">&quot;/api/v1.0/user/avatar&quot;</span><span class="token punctuation">,</span>handler<span class="token punctuation">.</span>PostAvatar<span class="token punctuation">)</span>
</code></pre></div><p>web下handle</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token comment">//上传用户头像 PostAvatar</span>
<span class="token keyword">func</span> <span class="token function">PostAvatar</span><span class="token punctuation">(</span>w http<span class="token punctuation">.</span>ResponseWriter<span class="token punctuation">,</span> r <span class="token operator">*</span>http<span class="token punctuation">.</span>Request<span class="token punctuation">,</span><span class="token boolean">_</span> httprouter<span class="token punctuation">.</span>Params<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;上传用户头像 PostAvatar /api/v1.0/user/avatar&quot;</span><span class="token punctuation">)</span>

	<span class="token comment">//创建服务</span>
	service <span class="token operator">:=</span> grpc<span class="token punctuation">.</span><span class="token function">NewService</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	service<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

	<span class="token comment">//创建句柄</span>
	exampleClient <span class="token operator">:=</span> POSTAVATAR<span class="token punctuation">.</span><span class="token function">NewExampleService</span><span class="token punctuation">(</span><span class="token string">&quot;go.micro.srv.PostAvatar&quot;</span><span class="token punctuation">,</span> service<span class="token punctuation">.</span><span class="token function">Client</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

	<span class="token comment">//查看登陆信息</span>
	userlogin<span class="token punctuation">,</span>err<span class="token operator">:=</span>r<span class="token punctuation">.</span><span class="token function">Cookie</span><span class="token punctuation">(</span><span class="token string">&quot;userlogin&quot;</span><span class="token punctuation">)</span>

	<span class="token comment">//如果没有登陆就返回错误</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span><span class="token punctuation">{</span>
		resp <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">{</span>
			<span class="token string">&quot;errno&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span>RECODE_SESSIONERR<span class="token punctuation">,</span>
			<span class="token string">&quot;errmsg&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>utils<span class="token punctuation">.</span>RECODE_SESSIONERR<span class="token punctuation">)</span><span class="token punctuation">,</span>
		<span class="token punctuation">}</span>

		w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">&quot;Content-Type&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;application/json&quot;</span><span class="token punctuation">)</span>
		<span class="token comment">// encode and write the response as json</span>
		<span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span>resp<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
			http<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">503</span><span class="token punctuation">)</span>
			beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span>
			<span class="token keyword">return</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//接收前端发送过来的文集</span>
	file<span class="token punctuation">,</span>hander<span class="token punctuation">,</span>err<span class="token operator">:=</span>r<span class="token punctuation">.</span><span class="token function">FormFile</span><span class="token punctuation">(</span><span class="token string">&quot;avatar&quot;</span><span class="token punctuation">)</span>

	<span class="token comment">//判断是否接受成功</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;Postupavatar   c.GetFile(avatar) err&quot;</span> <span class="token punctuation">,</span>err<span class="token punctuation">)</span>

		resp <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">{</span>
			<span class="token string">&quot;errno&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span>RECODE_IOERR<span class="token punctuation">,</span>
			<span class="token string">&quot;errmsg&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>utils<span class="token punctuation">.</span>RECODE_IOERR<span class="token punctuation">)</span><span class="token punctuation">,</span>
		<span class="token punctuation">}</span>
		w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">&quot;Content-Type&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;application/json&quot;</span><span class="token punctuation">)</span>
		<span class="token comment">// encode and write the response as json</span>
		<span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span>resp<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
			http<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">503</span><span class="token punctuation">)</span>
			beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span>
			<span class="token keyword">return</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//打印基本信息</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>file <span class="token punctuation">,</span>hander<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;文件大小&quot;</span><span class="token punctuation">,</span>hander<span class="token punctuation">.</span>Size<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;文件名&quot;</span><span class="token punctuation">,</span>hander<span class="token punctuation">.</span>Filename<span class="token punctuation">)</span>

	<span class="token comment">//二进制的空间用来存储文件</span>
	filebuffer<span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span><span class="token punctuation">,</span>hander<span class="token punctuation">.</span>Size<span class="token punctuation">)</span>

	<span class="token comment">//将文件读取到filebuffer里</span>
	<span class="token boolean">_</span><span class="token punctuation">,</span>err <span class="token operator">=</span> file<span class="token punctuation">.</span><span class="token function">Read</span><span class="token punctuation">(</span>filebuffer<span class="token punctuation">)</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;Postupavatar   file.Read(filebuffer) err&quot;</span> <span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		resp <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">{</span>
			<span class="token string">&quot;errno&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span>RECODE_IOERR<span class="token punctuation">,</span>
			<span class="token string">&quot;errmsg&quot;</span><span class="token punctuation">:</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>utils<span class="token punctuation">.</span>RECODE_IOERR<span class="token punctuation">)</span><span class="token punctuation">,</span>
		<span class="token punctuation">}</span>
		w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">&quot;Content-Type&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;application/json&quot;</span><span class="token punctuation">)</span>
		<span class="token comment">// encode and write the response as json</span>
		<span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span>resp<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
			http<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">503</span><span class="token punctuation">)</span>
			beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span>
			<span class="token keyword">return</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//调用函数传入数据</span>
	rsp<span class="token punctuation">,</span> err <span class="token operator">:=</span> exampleClient<span class="token punctuation">.</span><span class="token function">PostAvatar</span><span class="token punctuation">(</span>context<span class="token punctuation">.</span><span class="token function">TODO</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token operator">&amp;</span>POSTAVATAR<span class="token punctuation">.</span>Request<span class="token punctuation">{</span>
		Sessionid<span class="token punctuation">:</span>userlogin<span class="token punctuation">.</span>Value<span class="token punctuation">,</span>
		Filename<span class="token punctuation">:</span>hander<span class="token punctuation">.</span>Filename<span class="token punctuation">,</span>
		Filesize<span class="token punctuation">:</span>hander<span class="token punctuation">.</span>Size<span class="token punctuation">,</span>
		Avatar<span class="token punctuation">:</span>filebuffer<span class="token punctuation">,</span>
	<span class="token punctuation">}</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
		http<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">502</span><span class="token punctuation">)</span>

		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span>
		<span class="token comment">//beego.Debug(err)</span>
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//</span>

	<span class="token comment">//准备回传数据空间</span>
	data <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
	<span class="token comment">//url拼接然回回传数据</span>
	data<span class="token punctuation">[</span><span class="token string">&quot;avatar_url&quot;</span><span class="token punctuation">]</span><span class="token operator">=</span>utils<span class="token punctuation">.</span><span class="token function">AddDomain2Url</span><span class="token punctuation">(</span>rsp<span class="token punctuation">.</span>AvatarUrl<span class="token punctuation">)</span>



	resp <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">{</span>
		<span class="token string">&quot;errno&quot;</span><span class="token punctuation">:</span> rsp<span class="token punctuation">.</span>Errno<span class="token punctuation">,</span>
		<span class="token string">&quot;errmsg&quot;</span><span class="token punctuation">:</span> rsp<span class="token punctuation">.</span>Errmsg<span class="token punctuation">,</span>
		<span class="token string">&quot;data&quot;</span><span class="token punctuation">:</span>data<span class="token punctuation">,</span>
	<span class="token punctuation">}</span>

	w<span class="token punctuation">.</span><span class="token function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">&quot;Content-Type&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;application/json&quot;</span><span class="token punctuation">)</span>

	<span class="token comment">// encode and write the response as json</span>
	<span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">NewEncoder</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Encode</span><span class="token punctuation">(</span>resp<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
		http<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">503</span><span class="token punctuation">)</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span>
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>


	<span class="token keyword">return</span>
<span class="token punctuation">}</span>
</code></pre></div><p>服务端</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token comment">// Call is a single request handler called via client.Call or the generated client code</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>e <span class="token operator">*</span>Example<span class="token punctuation">)</span> <span class="token function">PostAvatar</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> req <span class="token operator">*</span>example<span class="token punctuation">.</span>Request<span class="token punctuation">,</span> rsp <span class="token operator">*</span>example<span class="token punctuation">.</span>Response<span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;上传用户头像 PostAvatar /api/v1.0/user/avatar&quot;</span><span class="token punctuation">)</span>
	<span class="token comment">//初始化返回正确的返回值</span>
	rsp<span class="token punctuation">.</span>Errno <span class="token operator">=</span> utils<span class="token punctuation">.</span>RECODE_OK
	rsp<span class="token punctuation">.</span>Errmsg <span class="token operator">=</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>rsp<span class="token punctuation">.</span>Errno<span class="token punctuation">)</span>

	<span class="token comment">//检查下数据是否正常</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token function">len</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>Avatar<span class="token punctuation">)</span><span class="token punctuation">,</span>req<span class="token punctuation">.</span>Filesize<span class="token punctuation">)</span>


	<span class="token comment">/*获取文件的后缀名*/</span>     <span class="token comment">//dsnlkjfajadskfksda.sadsdasd.sdasd.jpg</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;后缀名&quot;</span><span class="token punctuation">,</span>path<span class="token punctuation">.</span><span class="token function">Ext</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>Filename<span class="token punctuation">)</span><span class="token punctuation">)</span>

	<span class="token comment">/*存储文件到fastdfs当中并且获取 url*/</span>
	<span class="token comment">//.jpg</span>
	fileext <span class="token operator">:=</span>path<span class="token punctuation">.</span><span class="token function">Ext</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>Filename<span class="token punctuation">)</span>
	<span class="token comment">//group1 group1/M00/00/00/wKgLg1t08pmANXH1AAaInSze-cQ589.jpg</span>
	<span class="token comment">//上传数据</span>
	Group<span class="token punctuation">,</span>FileId <span class="token punctuation">,</span>err <span class="token operator">:=</span>  models<span class="token punctuation">.</span><span class="token function">UploadByBuffer</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>Avatar<span class="token punctuation">,</span>fileext<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;Postupavatar  models.UploadByBuffer err&quot;</span> <span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		rsp<span class="token punctuation">.</span>Errno <span class="token operator">=</span> utils<span class="token punctuation">.</span>RECODE_IOERR
		rsp<span class="token punctuation">.</span>Errmsg <span class="token operator">=</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>rsp<span class="token punctuation">.</span>Errno<span class="token punctuation">)</span>
		<span class="token keyword">return</span> <span class="token boolean">nil</span>
	<span class="token punctuation">}</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>Group<span class="token punctuation">)</span>

	<span class="token comment">/*通过session 获取我们当前现在用户的uesr_id*/</span>
	redis_config_map <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span>
		<span class="token string">&quot;key&quot;</span><span class="token punctuation">:</span>utils<span class="token punctuation">.</span>G_server_name<span class="token punctuation">,</span>
		<span class="token comment">//&quot;conn&quot;:&quot;127.0.0.1:6379&quot;,</span>
		<span class="token string">&quot;conn&quot;</span><span class="token punctuation">:</span>utils<span class="token punctuation">.</span>G_redis_addr<span class="token operator">+</span><span class="token string">&quot;:&quot;</span><span class="token operator">+</span>utils<span class="token punctuation">.</span>G_redis_port<span class="token punctuation">,</span>
		<span class="token string">&quot;dbNum&quot;</span><span class="token punctuation">:</span>utils<span class="token punctuation">.</span>G_redis_dbnum<span class="token punctuation">,</span>
	<span class="token punctuation">}</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>redis_config_map<span class="token punctuation">)</span>
	redis_config <span class="token punctuation">,</span><span class="token boolean">_</span><span class="token operator">:=</span>json<span class="token punctuation">.</span><span class="token function">Marshal</span><span class="token punctuation">(</span>redis_config_map<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span> <span class="token function">string</span><span class="token punctuation">(</span>redis_config<span class="token punctuation">)</span> <span class="token punctuation">)</span>
	<span class="token comment">//连接redis数据库 创建句柄</span>
	bm<span class="token punctuation">,</span> err <span class="token operator">:=</span> cache<span class="token punctuation">.</span><span class="token function">NewCache</span><span class="token punctuation">(</span><span class="token string">&quot;redis&quot;</span><span class="token punctuation">,</span> <span class="token function">string</span><span class="token punctuation">(</span>redis_config<span class="token punctuation">)</span> <span class="token punctuation">)</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;缓存创建失败&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		rsp<span class="token punctuation">.</span>Errno  <span class="token operator">=</span>  utils<span class="token punctuation">.</span>RECODE_DBERR
		rsp<span class="token punctuation">.</span>Errmsg  <span class="token operator">=</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>rsp<span class="token punctuation">.</span>Errno<span class="token punctuation">)</span>
		<span class="token keyword">return</span>  <span class="token boolean">nil</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//拼接key</span>
	sessioniduserid <span class="token operator">:=</span>  req<span class="token punctuation">.</span>Sessionid <span class="token operator">+</span> <span class="token string">&quot;user_id&quot;</span>

	<span class="token comment">//获得当前用户的userid</span>
	value_id <span class="token operator">:=</span>bm<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span>sessioniduserid<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>value_id<span class="token punctuation">,</span>reflect<span class="token punctuation">.</span><span class="token function">TypeOf</span><span class="token punctuation">(</span>value_id<span class="token punctuation">)</span><span class="token punctuation">)</span>


	id <span class="token operator">:=</span>  <span class="token function">int</span><span class="token punctuation">(</span>value_id<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>id <span class="token punctuation">,</span>reflect<span class="token punctuation">.</span><span class="token function">TypeOf</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">)</span>

	<span class="token comment">//创建表对象</span>
	user <span class="token operator">:=</span> models<span class="token punctuation">.</span>User<span class="token punctuation">{</span>Id<span class="token punctuation">:</span>id<span class="token punctuation">,</span>Avatar_url<span class="token punctuation">:</span>FileId<span class="token punctuation">}</span>
	<span class="token comment">/*将当前fastdfs-url 存储到我们当前用户的表中*/</span>
	o<span class="token operator">:=</span>orm<span class="token punctuation">.</span><span class="token function">NewOrm</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	<span class="token comment">//将图片的地址存入表中</span>
	<span class="token boolean">_</span> <span class="token punctuation">,</span>err <span class="token operator">=</span>o<span class="token punctuation">.</span><span class="token function">Update</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>user <span class="token punctuation">,</span><span class="token string">&quot;avatar_url&quot;</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> err <span class="token operator">!=</span><span class="token boolean">nil</span> <span class="token punctuation">{</span>

		rsp<span class="token punctuation">.</span>Errno <span class="token operator">=</span> utils<span class="token punctuation">.</span>RECODE_DBERR
		rsp<span class="token punctuation">.</span>Errmsg <span class="token operator">=</span> utils<span class="token punctuation">.</span><span class="token function">RecodeText</span><span class="token punctuation">(</span>rsp<span class="token punctuation">.</span>Errno<span class="token punctuation">)</span>

	<span class="token punctuation">}</span>

	<span class="token comment">//回传图片地址</span>
	rsp<span class="token punctuation">.</span>AvatarUrl<span class="token operator">=</span>FileId

	<span class="token keyword">return</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="使用fastdfs-nginx"><a href="#使用fastdfs-nginx" class="header-anchor">#</a> 使用fastdfs+nginx</h2> <h3 id="fastdfs安装"><a href="#fastdfs安装" class="header-anchor">#</a> fastdfs安装</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#安装libevent</span>
<span class="token comment">#解压 </span>
$ <span class="token function">tar</span> zxvf libevent-2.1.8-stable.tar.gz 
$ <span class="token builtin class-name">cd</span> libevent-2.1.8-stable/
<span class="token comment">#检查 </span>
$ ./configure
<span class="token comment">#编译</span>
$ <span class="token function">make</span> 
<span class="token comment">#安装</span>
$ <span class="token function">sudo</span> <span class="token function">make</span> <span class="token function">install</span>
<span class="token comment">#检查安装是否成功 </span>
$ <span class="token function">ls</span> -al /usr/local/lib/ <span class="token operator">|</span> <span class="token function">grep</span> libevent
<span class="token comment">#防止在系统默认路径下 找不到库文件</span>
$ <span class="token function">sudo</span> <span class="token function">ln</span> -s /usr/local/lib/libevent-2.1.so.6 /usr/lib/libevent-2.1.so.6

<span class="token comment">#安装libfastcommon</span>
$ <span class="token function">unzip</span> libfastcommon-1.36.zip 
$ <span class="token builtin class-name">cd</span> libfastcommon-master/
$ ./make.sh
$ <span class="token function">sudo</span> ./make.sh <span class="token function">install</span>

<span class="token comment">#安装fastdfs</span>
<span class="token comment">#解压</span>
$ <span class="token function">tar</span> -zxvf fastdfs-5.10.tar.gz 
$ <span class="token builtin class-name">cd</span> fastdfs-5.10/
<span class="token comment">#编译</span>
$ ./make.sh 
<span class="token comment">#安装</span>
$ <span class="token function">sudo</span> ./make.sh <span class="token function">install</span> 
<span class="token comment">#验证</span>
$ <span class="token function">ls</span> -al /usr/bin/fdfs*
$ fdfs_test
</code></pre></div><h3 id="配置-fastdfs"><a href="#配置-fastdfs" class="header-anchor">#</a> 配置 fastdfs</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#默认的配置文件地址在/etc/fdfs下</span>
<span class="token comment">#因为我们的项目需要</span>
<span class="token comment">#所以我们需要将配置文件拷贝到我们的conf文件夹下进配置</span>
$ <span class="token builtin class-name">cd</span> /etc/fdfs
$ <span class="token function">cp</span>  client.conf.sample  storage.conf.sample  tracker.conf.sample <span class="token variable">$GOPATH</span>/src/sss/Ihomeweb/conf
<span class="token comment">#将配置文件的名字进行下修改</span>
<span class="token comment">#客户端</span>
$ <span class="token function">mv</span> client.conf.sample  client.conf
<span class="token comment">#存储文件</span>
$ <span class="token function">mv</span> storage.conf.sample  storage.conf
<span class="token comment">#跟踪器</span>
$ <span class="token function">mv</span> tracker.conf.sample  tracker.conf
<span class="token comment">#准备文件夹在项目下创建文件夹</span>
$ <span class="token builtin class-name">cd</span> /home/itcast/go/src/sss
$ <span class="token function">mkdir</span> fastdfs 
<span class="token comment">#在fastdfs下创建四个文件夹 </span>
$ <span class="token builtin class-name">cd</span> fastdfs
$ <span class="token function">mkdir</span> tracker client storage storage_data

<span class="token comment">##配置tracker.conf</span>
<span class="token comment">#6行的ip地址设置</span>
<span class="token comment"># bind an address of this host</span>
<span class="token comment"># empty for bind all addresses of this host</span>
<span class="token assign-left variable">bind_addr</span><span class="token operator">=</span><span class="token number">192.168</span>.110.123（需要配置的ip）

<span class="token comment">#21行的的log日志设置</span>
<span class="token comment"># the base path to store data and log files</span>
<span class="token assign-left variable">base_path</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/tracker（log目录）

<span class="token comment">##配置storage.conf</span>
<span class="token comment">#13行配置ip</span>
<span class="token comment"># bind an address of this host</span>
<span class="token comment"># empty for bind all addresses of this host</span>
<span class="token assign-left variable">bind_addr</span><span class="token operator">=</span><span class="token number">192.168</span>.110.123
<span class="token comment">#40行的log日志设置</span>
<span class="token comment"># the base path to store data and log files</span>
<span class="token assign-left variable">base_path</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/storage（log目录）

<span class="token comment">#107行的文件存放设置</span>
<span class="token comment"># store_path#, based 0, if store_path0 not exists, it's value is base_path</span>
<span class="token comment"># the paths must be exist</span>
<span class="token assign-left variable">store_path0</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/storage_data（文件存放路径）
<span class="token comment">#store_path1=/home/yuqing/fastdfs2</span>

<span class="token comment">#116行tracker的ip地址</span>
<span class="token comment"># tracker_server can ocur more than once, and tracker_server format is</span>
<span class="token comment">#  &quot;host:port&quot;, host can be hostname or ip address</span>
<span class="token assign-left variable">tracker_server</span><span class="token operator">=</span><span class="token number">192.168</span>.110.7:22122

<span class="token comment">##配置client.conf日志</span>
<span class="token comment">#9行的log日志地址</span>
<span class="token comment"># the base path to store log files</span>
<span class="token assign-left variable">base_path</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/client（log目录）
<span class="token comment">#12行追踪器的ip</span>
<span class="token comment"># tracker_server can ocur more than once, and tracker_server format is</span>
<span class="token comment">#  &quot;host:port&quot;, host can be hostname or ip address</span>
<span class="token assign-left variable">tracker_server</span><span class="token operator">=</span><span class="token number">192.168</span>.110.123:22122

更新项目目录下的的setup_server.sh文件
<span class="token comment">#启动redis服务</span>
redis-server ./conf/redis.conf

<span class="token comment">#启动trackerd</span>

fdfs_trackerd  /home/itcast/go/src/sss/homeweb/conf/tracker.conf restart
<span class="token comment">#启动storaged</span>

fdfs_storaged  /home/itcast/go/src/sss/homeweb/conf/storage.conf restart

我们先测试下 
Fdfs_upload_file ./conf/client.conf cj.jpg

</code></pre></div><h3 id="安装步骤nginx操作fast步骤"><a href="#安装步骤nginx操作fast步骤" class="header-anchor">#</a> 安装步骤nginx操作fast步骤</h3> <h4 id="关于nginx操作fastdfs的插件"><a href="#关于nginx操作fastdfs的插件" class="header-anchor">#</a> 关于nginx操作fastdfs的插件</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#将事先准备好的fastdfs的插件拷贝到ubuntu中</span>
<span class="token comment">#解压nginx关于fastdfs的插件</span>
$ <span class="token function">tar</span> -zxvf fastdfs-nginx-module_v1.16.tar.gz 
<span class="token comment">#查看当前目录下存在两个解压好的文件</span>
$ <span class="token function">ls</span>
fastdfs-nginx-module    nginx-1.10.1  
<span class="token comment">#进入fastdfs-nginx-module</span>
$ <span class="token builtin class-name">cd</span> fastdfs-nginx-module
<span class="token comment">#查看当前文件夹下文件</span>
$ tree
<span class="token builtin class-name">.</span>
├── HISTORY
├── INSTALL
└── src
    ├── common.c
    ├── common.h
    ├── config
    ├── mod_fastdfs.conf
    └── ngx_http_fastdfs_module.c
<span class="token comment">#查看INSTALL文件</span>
$ <span class="token function">vim</span> INSTALL
</code></pre></div><h4 id="关于fastdfs插件的安装介绍"><a href="#关于fastdfs插件的安装介绍" class="header-anchor">#</a> 关于fastdfs插件的安装介绍</h4> <div class="language- extra-class"><pre class="language-text"><code>版权所有 2010开心鱼 / 余庆
这个软件只能在GNU通用条款下被复制
公共许可证V3，请访问FastDFS主页以获得更多详细信息。
英语:http://english.csource.org/
中文:http://www.csource.org/

#步骤1.首先安装FastDFS存储服务器和客户端库，
FastDFS版本应该是&gt;= 2.09。下载地址:
https://code.google.com/p/fastdfs/downloads/list

#步骤2.安装nginx服务器
FastDFS nginx模块测试通过nginx 0.8.53，
我的nginx安装在/usr/local/nginx

#步骤3.下载FastDFS nginx模块源代码包并解压，如:
tar xzf fastdfs_nginx_module_v1.16.tar.gz

#步骤4.输入nginx源目录，编译并安装模块，如:
cd nginx-1.5.12
./configure --add-module=/home/yuqing/fastdfs-nginx-module/src
make; make install

注意:在编译之前，你可以更改FDFS_OUTPUT_CHUNK_SIZE和
FDFS_MOD_CONF_FILENAME的宏定义在配置文件中:

CFLAGS=&quot;$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\&quot;/etc/fdfs/mod_fastdfs.conf\&quot;'&quot;



#步骤5.配置nginx配置文件，例如nginx.conf，添加以下行:

        location /M00 {
            root /home/yuqing/fastdfs/data;
            ngx_fastdfs_module;
        }

#步骤6.将一个符号链接${fastdfs_base_path}/data/M00到${fastdfs_base_path}/data，

命令行，例如:
ln -s /home/yuqing/fast /data/ home/yuqing/fast /data/ m00

#步骤7.更改配置文件/etc/fdfs/mod_fastdfs.conf，更多细节请看

#步骤8.重新启动nginx服务器，例如:
/usr/local/nginx/sbin/nginx -s stop; /usr/local/nginx/sbin/nginx
</code></pre></div><h4 id="修改fastdfs插件安装的配置文件"><a href="#修改fastdfs插件安装的配置文件" class="header-anchor">#</a> 修改fastdfs插件安装的配置文件</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#进入到插件的src目录下</span>
$ cd/home/itcast/ffdfs/fastdfs-nginx-module/src
<span class="token comment">#修改config配置文件</span>
$ <span class="token function">vi</span> config
<span class="token assign-left variable">CORE_INCS</span><span class="token operator">=</span><span class="token string">&quot;<span class="token variable">$CORE_INCS</span> /usr/local/include/fastdfs /usr/local/include/fastcommon/&quot;</span> 
<span class="token comment">#修改为:</span>
<span class="token assign-left variable">CORE_INCS</span><span class="token operator">=</span><span class="token string">&quot;<span class="token variable">$CORE_INCS</span> /usr/include/fastdfs /usr/include/fastcommon/&quot;</span>
</code></pre></div><h4 id="nginx的安装依赖"><a href="#nginx的安装依赖" class="header-anchor">#</a> nginx的安装依赖</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#讲准备好的依赖文件拷贝到ubuntu中</span>
<span class="token comment">#依次解压依赖</span>
$ <span class="token function">tar</span> -zxvf openssl-1.0.1t.tar.gz 
$ <span class="token function">tar</span> -zxvf zlib-1.2.11.tar.gz
$ <span class="token function">tar</span> -jxvf pcre-8.40.tar.bz2 
 

<span class="token comment">#进入openssl-1.0.1t</span>
$ <span class="token builtin class-name">cd</span> openssl-1.0.1t
<span class="token comment">#检查</span>
$ <span class="token function">sudo</span> ./config
<span class="token comment">#编译</span>
$ <span class="token function">sudo</span> <span class="token function">make</span>
<span class="token comment">#安装</span>
$ <span class="token function">sudo</span> <span class="token function">make</span> <span class="token function">install</span>

<span class="token comment">#进入zlib-1.2.11</span>
$ <span class="token builtin class-name">cd</span> zlib-1.2.11
<span class="token comment">#检查</span>
$ <span class="token function">sudo</span> ./configure
<span class="token comment">#编译</span>
$ <span class="token function">sudo</span> <span class="token function">make</span>
<span class="token comment">#安装</span>
$ <span class="token function">sudo</span> <span class="token function">make</span> <span class="token function">install</span>

<span class="token comment">#进入pcre-8.40</span>
$ <span class="token builtin class-name">cd</span> pcre-8.40
<span class="token comment">#检查</span>
$ <span class="token function">sudo</span> ./configure
<span class="token comment">#编译</span>
$ <span class="token function">sudo</span> <span class="token function">make</span>
<span class="token comment">#安装</span>
$ <span class="token function">sudo</span> <span class="token function">make</span> <span class="token function">install</span>
</code></pre></div><h4 id="nginx正规联合编译方法"><a href="#nginx正规联合编译方法" class="header-anchor">#</a> nginx正规联合编译方法</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#将事先准备好的nginx安装包拷贝到ubuntu中 </span>
<span class="token comment">#解压nginx压缩包</span>
$ <span class="token function">tar</span> -zxvf nginx-1.10.1.tar.gz 
<span class="token comment">#进入nginx</span>
$ <span class="token builtin class-name">cd</span> /home/itcast/ffdfs/nginx-1.10.1
<span class="token comment">#进行nginx和fastdfs插件的联合编译</span>
<span class="token comment">#检查</span>
$ ./configure --with-openssl<span class="token operator">=</span>openssl源码目录 --with-pcre<span class="token operator">=</span>pcre的源码目录 --with-zlib<span class="token operator">=</span>zlib  --add-module<span class="token operator">=</span>插件src目录

$ ./configure --with-openssl<span class="token operator">=</span>/home/itcast/openssl-1.0.1t --with-pcre<span class="token operator">=</span>/home/itcast/pcre-8.40 --with-zlib<span class="token operator">=</span>/home/itcast/zlib-1.2.11 --with-http_ssl_module  --add-module<span class="token operator">=</span>/home/itcast/fastdfs-nginx-module_v1.16/fastdfs-nginx-module/src 
<span class="token comment">#编译</span>
$ <span class="token function">make</span>
<span class="token comment">#安装</span>
$ <span class="token function">make</span> <span class="token function">install</span>
<span class="token comment">#创建软连接方便调用</span>
$ <span class="token function">ln</span> -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
</code></pre></div><h5 id="注意1：找不到sha1的库"><a href="#注意1：找不到sha1的库" class="header-anchor">#</a> 注意1：找不到sha1的库</h5> <div class="language- extra-class"><pre class="language-text"><code>#在nginx 下执行 ./configure后最近结果显示会出现如下问题
sha1 library is not found
#找不到sha1的库
#configure的时候增加参数 --with-http_ssl_module
</code></pre></div><h5 id="注意2：编译异常"><a href="#注意2：编译异常" class="header-anchor">#</a> 注意2：编译异常</h5> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#在 make时出现如下问题</span>
src/core/ngx_murmurhash.c: In <span class="token keyword">function</span> ‘ngx_murmur_hash2’:
src/core/ngx_murmurhash.c:37:11: error: this statement may fall through <span class="token punctuation">[</span>-Werror<span class="token operator">=</span>implicit-fallthrough<span class="token operator">=</span><span class="token punctuation">]</span>
         h ^<span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> <span class="token number">16</span><span class="token punctuation">;</span>
         ~~^~~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:38:5: note: here
     <span class="token keyword">case</span> <span class="token number">2</span>:
     ^~~~
src/core/ngx_murmurhash.c:39:11: error: this statement may fall through <span class="token punctuation">[</span>-Werror<span class="token operator">=</span>implicit-fallthrough<span class="token operator">=</span><span class="token punctuation">]</span>
         h ^<span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">;</span>
         ~~^~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:40:5: note: here
     <span class="token keyword">case</span> <span class="token number">1</span>:
     ^~~~
cc1: all warnings being treated as errors
objs/Makefile:485: recipe <span class="token keyword">for</span> target <span class="token string">'objs/src/core/ngx_murmurhash.o'</span> failed
make<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>: *** <span class="token punctuation">[</span>objs/src/core/ngx_murmurhash.o<span class="token punctuation">]</span> Error <span class="token number">1</span>
make<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>: 离开目录“/home/itcast/ffdfs/nginx-1.10.1”
Makefile:8: recipe <span class="token keyword">for</span> target <span class="token string">'build'</span> failed
make: *** <span class="token punctuation">[</span>build<span class="token punctuation">]</span> Error <span class="token number">2</span>

<span class="token comment">#主要原因是 Makefile 里面  gcc 的参数多了一个&quot;-Werror&quot;</span>
<span class="token comment">#进入到/home/itcast/ffdfs/nginx-1.10.1/objs中修改Makefile</span>
<span class="token function">vim</span> Makefile 
<span class="token comment">#删除&quot;-Werror&quot;得到如下内容</span>
CFLAGS <span class="token operator">=</span>  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused  -g  -D_FILE_OFFSET_BITS<span class="token operator">=</span><span class="token number">64</span> -DFDFS_OUTPUT_CHUNK_SIZE<span class="token operator">=</span><span class="token string">'256*1024'</span> -DFDFS_MOD_CONF_FILENAME<span class="token operator">=</span><span class="token string">'&quot;/etc/fdfs/mod_fastdfs.conf&quot;'</span>

</code></pre></div><h5 id="注意3：插件配置文件不存在"><a href="#注意3：插件配置文件不存在" class="header-anchor">#</a> 注意3：插件配置文件不存在</h5> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#联合编译安装好nginx后启动nginx如下效果发现只有1个进程</span>
$ nginx 
$ <span class="token function">ps</span> aux<span class="token operator">|</span><span class="token function">grep</span> nginx
<span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
root  <span class="token number">105455</span> <span class="token builtin class-name">cd</span> 
<span class="token comment">#查看 /usr/local/nginx/logs 目录下的日志 </span>
$ <span class="token function">cat</span> /usr/local/nginx/logs/error.log
<span class="token comment">#发现这样一条错误</span>
ERROR - file: shared_func.c, line: <span class="token number">968</span>, <span class="token function">file</span> /etc/fdfs/mod_fastdfs.conf not exist
错误 - 文件 :shared_func.c <span class="token number">968</span>行 访问 /etc/fdfs/mod_fastdfs.conf 不存在 

<span class="token comment">#确认下文件是否存在</span>
$ <span class="token builtin class-name">cd</span> /etc/fdfs/
$ <span class="token function">ls</span>
client.conf.sample  storage.conf.sample  storage_ids.conf.sample  tracker.conf.sample
<span class="token comment">#确实不存在</span>

<span class="token comment">#解决</span>
<span class="token comment">#需要从fastdfs源码目录中复制过来</span>
$ <span class="token builtin class-name">cd</span> /home/itcast/ffdfs/fastdfs-nginx-module/src
<span class="token comment">#将mod_fastdfs.conf 文件从当前目录下拷贝到/etc/fdfs/目录下</span>
$ <span class="token function">sudo</span> <span class="token function">cp</span> /home/itcast/ffdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
</code></pre></div><h5 id="注意4：配置文件修改"><a href="#注意4：配置文件修改" class="header-anchor">#</a> 注意4：配置文件修改</h5> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#修改fastdfs插件的配置文件进行修改，参数当前存储节点的storage.conf进行修改</span>
<span class="token comment">#进入到/etc/fdfs/目录</span>
$ <span class="token builtin class-name">cd</span> /etc/fdfs/
<span class="token comment">#编辑 mod_fastdfs.conf 文件</span>
$ <span class="token function">sudo</span> <span class="token function">vim</span> mod_fastdfs.conf

<span class="token comment"># 存储log日志的目录</span>
 <span class="token number">9</span> <span class="token comment"># the base path to store log files</span>
 <span class="token number">10</span> <span class="token assign-left variable">base_path</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/storage
<span class="token comment"># 追踪器的地址信息</span>
 <span class="token number">37</span> <span class="token comment"># FastDFS tracker_server can ocur more than once, and tracker_server format is</span>
 <span class="token number">38</span> <span class="token comment">#  &quot;host:port&quot;, host can be hostname or ip address</span>
 <span class="token number">39</span> <span class="token comment"># valid only when load_fdfs_parameters_from_tracker is true</span>
 <span class="token number">40</span> <span class="token assign-left variable">tracker_server</span><span class="token operator">=</span><span class="token number">192.168</span>.110.20:22122
<span class="token comment"># 当前存储节点监听的端口</span>
 <span class="token number">42</span> <span class="token comment"># the port of the local storage server</span>
 <span class="token number">43</span> <span class="token comment"># the default value is 23000</span>
 <span class="token number">44</span> <span class="token assign-left variable">storage_server_port</span><span class="token operator">=</span><span class="token number">23000</span>
 <span class="token comment"># 当前存储节点所属的组</span>
 <span class="token number">46</span> <span class="token comment"># the group name of the local storage server</span>
 <span class="token number">47</span> <span class="token assign-left variable">group_name</span><span class="token operator">=</span>group1
<span class="token comment"># 客户端访问的url中是不是出现组名</span>
 <span class="token number">49</span> <span class="token comment"># if the url / uri including the group name</span>
 <span class="token number">50</span> <span class="token comment"># set to false when uri like /M00/00/00/xxx</span>
 <span class="token number">51</span> <span class="token comment"># set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx</span>
 <span class="token number">52</span> <span class="token comment"># default value is false</span>
 <span class="token number">53</span> url_have_group_name <span class="token operator">=</span> <span class="token boolean">true</span>
 <span class="token comment"># 当前存储节点存储路径的个数 参照 storage.conf</span>
 <span class="token number">55</span> <span class="token comment"># path(disk or mount point) count, default value is 1</span>
 <span class="token number">56</span> <span class="token comment"># must same as storage.conf</span>
 <span class="token number">57</span> <span class="token assign-left variable">store_path_count</span><span class="token operator">=</span><span class="token number">1</span>
<span class="token comment"># 详细的存储路径</span>
 <span class="token number">59</span> <span class="token comment"># store_path#, based 0, if store_path0 not exists, it's value is base_path</span>
 <span class="token number">60</span> <span class="token comment"># the paths must be exist</span>
 <span class="token number">61</span> <span class="token comment"># must same as storage.conf</span>
 <span class="token number">62</span> <span class="token assign-left variable">store_path0</span><span class="token operator">=</span>/home/itcast/go/src/sss/fastdfs/storage_data


<span class="token comment">#完成修改后再次启动nginx 依然是1个nginx进程</span>
$ <span class="token function">sudo</span> nginx 
$ <span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
root  <span class="token number">106838</span>  <span class="token number">0.0</span>  <span class="token number">0.0</span> <span class="token number">31384</span>   <span class="token number">764</span> ?    Ss <span class="token number">22</span>:09   <span class="token number">0</span>:00 nginx: master process nginx
itcast <span class="token number">106841</span> <span class="token number">0.0</span>  <span class="token number">0.0</span> <span class="token number">21536</span>  <span class="token number">1048</span> pts/15  S+ <span class="token number">22</span>:09   <span class="token number">0</span>:00 <span class="token function">grep</span> --color<span class="token operator">=</span>auto nginx
<span class="token comment">#查看日志</span>
$ <span class="token function">cat</span> /usr/local/nginx/logs/error.log
<span class="token comment">#发现新的错误</span>
ERROR - file: ini_file_reader.c, line: <span class="token number">631</span>, include <span class="token function">file</span> <span class="token string">&quot;http.conf&quot;</span> not exists, line: <span class="token string">&quot;#include http.conf&quot;</span>
<span class="token comment">#那么说明我们的配置文件就改好了</span>
</code></pre></div><h5 id="注意5：新的错误"><a href="#注意5：新的错误" class="header-anchor">#</a> 注意5：新的错误</h5> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#上面我们查看了新的日志发现了新的错误</span>
ERROR - file: ini_file_reader.c, line: <span class="token number">631</span>, include <span class="token function">file</span> <span class="token string">&quot;http.conf&quot;</span> not exists, line: <span class="token string">&quot;#include http.conf&quot;</span>
<span class="token comment">#错误 -文件 ：ini_file_reader.c 的第631行 导入文件的 http.conf 不存在</span>
	- 原因是从/etc/fdfs下加载该http.conf文件没找到
	- 从fastdfs的源码安装目录中找
	- fastdfs源码安装目录/conf/http.conf
	- <span class="token function">cp</span> fastdfs源码安装目录/conf/http.conf /etc/fdfs
$ <span class="token function">sudo</span> <span class="token function">cp</span> ./http.conf /etc/fdfs/
<span class="token comment">#进入etc下验证是否成功</span>
$ <span class="token builtin class-name">cd</span> /etc/fdfs/
$ <span class="token function">ls</span>
client.conf.sample  http.conf  mod_fastdfs.conf  storage.conf.sample  storage_ids.conf.sample  tracker.conf.sample
<span class="token comment">#停掉之前启动的nginx</span>
$ <span class="token function">sudo</span> nginx -s stop 
<span class="token comment">#查看是否停止</span>
$ <span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
itcast <span class="token number">107419</span> <span class="token number">0.0</span> <span class="token number">0.0</span> <span class="token number">21536</span> <span class="token number">1040</span> pts/15 S+ 09:36  <span class="token number">0</span>:00 <span class="token function">grep</span> --color<span class="token operator">=</span>auto nginx
<span class="token comment">#启动新的nginx</span>
$ <span class="token function">sudo</span> nginx 
<span class="token comment">#查看还是1个线程</span>
$ <span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
root   <span class="token number">107422</span> <span class="token number">0.0</span> <span class="token number">0.0</span> <span class="token number">31384</span>  <span class="token number">760</span> ?      Ss  09:36  <span class="token number">0</span>:00 nginx: master process nginx
itcast <span class="token number">107425</span> <span class="token number">0.0</span> <span class="token number">0.0</span> <span class="token number">21536</span> <span class="token number">1048</span> pts/15 S+  09:36  <span class="token number">0</span>:00 <span class="token function">grep</span> --color<span class="token operator">=</span>auto nginx

<span class="token comment">#发现还是有错误所以我们再次查看日志</span>
$ <span class="token function">cat</span> /usr/local/nginx/logs/error.log

<span class="token comment">#又一次出现了新的错误</span>
ERROR - file: shared_func.c, line: <span class="token number">968</span>, <span class="token function">file</span> /etc/fdfs/mime.types not exist
<span class="token comment">#说明我们http.conf的错误已经解决了</span>
</code></pre></div><h5 id="注意6：找不到文件"><a href="#注意6：找不到文件" class="header-anchor">#</a> 注意6：找不到文件</h5> <div class="language-SHELL extra-class"><pre class="language-shell"><code><span class="token comment">#ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mime.types not exist</span>
<span class="token comment">#错误 - file ： shared_func.c 文件的 第968 行 不能找到 /etc/fdfs/mime.types</span>
- 从nginx的源码安装目录中找
- nginx源码安装目录/conf/mime.types
- <span class="token function">cp</span> nginx源码安装目录/conf/mime.types /etc/fdfs
<span class="token comment">#找到nginx源码安装目录的文件</span>
$ <span class="token builtin class-name">cd</span> /home/itcast/ffdfs/nginx-1.10.1/conf
$ <span class="token function">ls</span>
fastcgi.conf  fastcgi_params  koi-utf  koi-win  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf
<span class="token comment">#发现文件存在后将其拷贝到/etc/fdfs</span>
$ <span class="token function">sudo</span> <span class="token function">cp</span> ./mime.types  /etc/fdfs/

<span class="token comment">#再次验证是否成功</span>
<span class="token comment">#停掉之前启动的nginx</span>
$ <span class="token function">sudo</span> nginx -s stop 
<span class="token comment">#查看是否停止</span>
$ <span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
itcast <span class="token number">107488</span> <span class="token number">0.0</span> <span class="token number">0.0</span> <span class="token number">21536</span> <span class="token number">1092</span> pts/15  S+  09:52  <span class="token number">0</span>:00 <span class="token function">grep</span> --color<span class="token operator">=</span>auto nginx
<span class="token comment">#启动nginx</span>
$ <span class="token function">sudo</span> nginx
itcast@itcast-virtual-machine:~/ffdfs/nginx-1.10.1/conf$ <span class="token function">ps</span> aux <span class="token operator">|</span><span class="token function">grep</span> nginx 
root   <span class="token number">107491</span> <span class="token number">0.0</span>  <span class="token number">0.0</span> <span class="token number">31384</span>   <span class="token number">764</span> ?     Ss  09:53  <span class="token number">0</span>:00 nginx: master process nginx
nobody <span class="token number">107492</span> <span class="token number">0.0</span>  <span class="token number">0.0</span> <span class="token number">36212</span>  <span class="token number">4016</span> ?      S   09:53  <span class="token number">0</span>:00 nginx: worker process
itcast <span class="token number">107494</span> <span class="token number">0.0</span>  <span class="token number">0.0</span> <span class="token number">21536</span>  <span class="token number">1152</span> pts/15 S+  09:53  <span class="token number">0</span>:00 <span class="token function">grep</span> --color<span class="token operator">=</span>auto nginx
<span class="token comment">#发现已经出现了worker的进程说明我们的nginx安装环境算是成功了</span>
</code></pre></div><h5 id="注意7：可能出现的问题"><a href="#注意7：可能出现的问题" class="header-anchor">#</a> 注意7：可能出现的问题</h5> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#可能出现的问题</span>
line: <span class="token number">177</span>, <span class="token string">&quot;Permission denied&quot;</span> can't be accessed
<span class="token comment">#没有权限访问</span>
    - 修改nginx.conf, 将worker进程的所有者改为root
    - user root<span class="token punctuation">;</span>
</code></pre></div><h4 id="修改nginx的访问配置文件"><a href="#修改nginx的访问配置文件" class="header-anchor">#</a> 修改nginx的访问配置文件</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#我们在虚拟机中访问我们的资源图片</span>
http://127.0.0.1/group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg
<span class="token comment">#会出现如下效果</span>
</code></pre></div><p><img src="assets/%5CUsers%5Ckstwo%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1537322430259.png" alt="1537322430259"></p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#此时我们需要再次访问我们的日志文件</span>
$ <span class="token function">cat</span> /usr/local/nginx/logs/error.log
<span class="token comment"># open() &quot;/usr/local/nginx/html/group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg&quot; failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: &quot;GET /group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg HTTP/1.1&quot;, host: &quot;127.0.0.1&quot;</span>
<span class="token comment">#打开图片文件失败（没有这样的文件或者是目录） 客户端是 127.0.0.1 服务器是localhost </span>
<span class="token comment">#发送请求&quot;GET /group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg HTTP/1.1&quot; </span>
<span class="token comment">#主机127.0.0.1</span>
<span class="token comment">#为什么是404？</span>
<span class="token comment">#nginx在解析客户端请求的时查找的资源目录是不对的，所以找不到我们想要的文件 </span>
<span class="token comment">#所以我们需要给nginx制定争取的目录</span>

<span class="token comment">#nginx 处理 http://127.0.0.1/group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg</span>
<span class="token comment">#去掉ip与文件名，得到 /group1/M00/00/00/</span>

<span class="token comment">#需要给修改nginx的配置文件添加location处理指令	</span>
	location /group1/M00/00/00/
	<span class="token punctuation">{</span>
		<span class="token comment"># 指定正确的资源路径</span>
        root /root/fdfs/storage/data<span class="token punctuation">;</span> // M00映射的实际路径
        ngx_fastdfs_module<span class="token punctuation">;</span> <span class="token comment"># 添加nginx对fastdfs模块的调用</span>
	<span class="token punctuation">}</span>
	
	
	
<span class="token comment">#进入nginx的配置文件目录下</span>
$ <span class="token builtin class-name">cd</span> /usr/local/nginx/conf
<span class="token comment">#备份 nginx.conf</span>
$ <span class="token function">sudo</span> <span class="token function">cp</span> nginx.conf nginx.conf.old
<span class="token comment">#编辑nginx.conf</span>
$ <span class="token function">sudo</span> <span class="token function">vim</span> nginx.conf 
<span class="token comment">#修改内容为</span>
	listen       <span class="token number">8888</span><span class="token punctuation">;</span>
    server_name  localhost<span class="token punctuation">;</span>
    <span class="token comment">#location  /group1/M00/ {</span>
    location  ~/group<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span>-9<span class="token punctuation">]</span><span class="token punctuation">)</span>/M00 <span class="token punctuation">{</span>
    <span class="token comment">#正确的数据路径</span>
        root   /home/itcast/go/src/sss/fastdfs/storage_data/data<span class="token punctuation">;</span>
        ngx_fastdfs_module<span class="token punctuation">;</span> <span class="token comment"># 添加nginx对fastdfs模块的调用</span>
    <span class="token punctuation">}</span>


<span class="token comment">#修改好文件之后加载文件则会出现1个新的进程就是这个插件的进程</span>
$ <span class="token function">sudo</span> nginx -s reload
<span class="token punctuation">[</span>sudo<span class="token punctuation">]</span> itcast 的密码： 
ngx_http_fastdfs_set <span class="token assign-left variable">pid</span><span class="token operator">=</span><span class="token number">107791</span>
<span class="token comment">#修改app.conf文件添加配置信息</span>

<span class="token comment">#成功之后我们再次访问图片</span>
http://127.0.0.1:8888/group1/M00/00/00/wKhuFFuRWriATb4DAADprYlRZN0624.jpg
<span class="token comment">#会出现以下效果</span>
</code></pre></div><p><img src="assets/%5CUsers%5Ckstwo%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1537328504896.png" alt="1537328504896"></p> <h2 id="go操作fastdfs"><a href="#go操作fastdfs" class="header-anchor">#</a> go操作fastdfs</h2> <p>安装库</p> <div class="language-shell extra-class"><pre class="language-shell"><code>go get github.com/weilaihui/fdfs_client
</code></pre></div><p>在models中创建fastdfs_client.go</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">package</span> models

<span class="token keyword">import</span> <span class="token punctuation">(</span>
	<span class="token string">&quot;github.com/weilaihui/fdfs_client&quot;</span>
	<span class="token string">&quot;github.com/astaxie/beego&quot;</span>
<span class="token punctuation">)</span>


<span class="token comment">//通过文件名的方式进行上传</span>
<span class="token keyword">func</span> <span class="token function">UploadByFilename</span><span class="token punctuation">(</span> filename <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token punctuation">(</span>GroupName<span class="token punctuation">,</span>RemoteFileId <span class="token builtin">string</span> <span class="token punctuation">,</span>err <span class="token builtin">error</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token comment">//通过配置文件创建fdfs操作句柄</span>
	fdfsClient<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfs_client<span class="token punctuation">.</span><span class="token function">NewFdfsClient</span><span class="token punctuation">(</span><span class="token string">&quot;/home/itcast/go/srcsss/homeweb/conf/client.conf&quot;</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		<span class="token comment">//说一下那里出问题了</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByFilename( ) fdfs_client.NewFdfsClient  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//unc (this *FdfsClient) UploadByFilename(filename string) (*UploadFileResponse, error)</span>
	<span class="token comment">//通过句柄上传文件（被上传的文件）</span>

	uploadResponse<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span> fdfsClient<span class="token punctuation">.</span><span class="token function">UploadByFilename</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByFilename( ) fdfsClient.UploadByFilename(filename)  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">)</span>
	<span class="token comment">//回传</span>
	<span class="token keyword">return</span>  uploadResponse<span class="token punctuation">.</span>GroupName <span class="token punctuation">,</span> uploadResponse<span class="token punctuation">.</span>RemoteFileId <span class="token punctuation">,</span><span class="token boolean">nil</span>

<span class="token punctuation">}</span>

<span class="token comment">//功能函数 操作fdfs上传二进制文件</span>
<span class="token keyword">func</span> <span class="token function">UploadByBuffer</span><span class="token punctuation">(</span>filebuffer <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span><span class="token punctuation">,</span> fileExtName <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token punctuation">(</span>GroupName<span class="token punctuation">,</span>RemoteFileId <span class="token builtin">string</span> <span class="token punctuation">,</span>err <span class="token builtin">error</span> <span class="token punctuation">)</span><span class="token punctuation">{</span>

	<span class="token comment">//通过配置文件创建fdfs操作句柄</span>
	fdfsClient<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfs_client<span class="token punctuation">.</span><span class="token function">NewFdfsClient</span><span class="token punctuation">(</span><span class="token string">&quot;/home/itcast/go/src/sss/homeweb/conf/client.conf&quot;</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByBuffer( ) fdfs_client.NewFdfsClient  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//通过句柄上传二进制的文件</span>
	uploadResponse<span class="token punctuation">,</span> thiserr <span class="token operator">:=</span>fdfsClient<span class="token punctuation">.</span><span class="token function">UploadByBuffer</span><span class="token punctuation">(</span>filebuffer<span class="token punctuation">,</span>fileExtName<span class="token punctuation">)</span>
	<span class="token keyword">if</span> thiserr  <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span>
		beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">&quot;UploadByBuffer( ) fdfs_client.UploadByBuffer  err&quot;</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span>
		GroupName <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		RemoteFileId <span class="token operator">=</span> <span class="token string">&quot;&quot;</span>
		err <span class="token operator">=</span> thiserr
		<span class="token keyword">return</span>
	<span class="token punctuation">}</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">)</span>
	beego<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">)</span>
	<span class="token comment">//回传</span>
	<span class="token keyword">return</span> uploadResponse<span class="token punctuation">.</span>GroupName<span class="token punctuation">,</span>uploadResponse<span class="token punctuation">.</span>RemoteFileId<span class="token punctuation">,</span><span class="token boolean">nil</span>

<span class="token punctuation">}</span>
</code></pre></div></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">7/20/2020, 2:09:44 AM</span></div></footer> <!----> </main></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.cb35c8f6.js" defer></script><script src="/assets/js/2.063846a6.js" defer></script><script src="/assets/js/4.1ffb4609.js" defer></script><script src="/assets/js/95.be52d65a.js" defer></script>
  </body>
</html>
